Разница между левым соединением и правым соединением в SQL Server

Я знаю о соединениях в SQL Server.

Например. Есть две таблицы Table1, Table2.

Их структура таблиц следующая.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Таблица1 данные следующим образом:

    Id     Name     
    -------------
    1      A        
    2      B    

Данные таблицы 2 следующим образом:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Если я выполню оба нижеупомянутых оператора SQL, оба вывода будут одинаковыми

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

Пожалуйста, объясните разницу между левым и правым соединением в приведенных выше инструкциях SQL.

Ответ 1

Select * from Table1 left join Table2 ...

и

Select * from Table2 right join Table1 ...

действительно взаимозаменяемы. Попробуйте, однако, Table2 left join Table1 (или его идентичную пару, Table1 right join Table2), чтобы увидеть разницу. Этот запрос должен дать вам больше строк, так как Table2 содержит строку с идентификатором, которой нет в таблице 1.

Ответ 3

Таблица, из которой вы берете данные, - "LEFT".
Таблица, которую вы присоединяете, - "ПРАВО".
LEFT JOIN: Возьмите все элементы из левой таблицы AND (только), соответствующие элементам из правого стола.
RIGHT JOIN: Возьмите все элементы из правой таблицы AND (только), соответствующие элементам из левой таблицы.
Итак:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

дает:

Id     Name       
-------------  
1      A          
2      B      

но:

Select * from Table1 right join Table2 on Table1.id = Table2.id

дает:

Id     Name       
-------------  
1      A          
2      B   
3      C  

вы были правы, присоединяясь к таблице с меньшим количеством строк на таблице с большим количеством строк
И
снова, левая соединительная таблица с меньшим количеством строк на столе с большим количеством строк
Попробуйте:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

Ответ 4

(INNER) JOIN: возвращает записи, которые имеют совпадающие значения в обеих таблицах.

LEFT (OUTER) JOIN: вернуть все записи из левой таблицы и сопоставленные записи из правой таблицы.

RIGHT (OUTER) JOIN: вернуть все записи из правой таблицы и сопоставленные записи из левой таблицы.

FULL (OUTER) JOIN: возвращать все записи, когда есть совпадение в левой или правой таблице

Например, предположим, у нас есть две таблицы со следующими записями:

Таблица А

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

Таблица Б

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

Внутреннее соединение

Примечание: это дает пересечение двух таблиц.

Inner Join

Синтаксис

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Примените это в вашей таблице образцов:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

Результат будет:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Оставить Присоединиться

Примечание: выдаст все выбранные строки в TableA, а также все общие выбранные строки в TableB.

Left join

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Примените это в вашей таблице образцов

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

Результат будет:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Право Присоединиться

Примечание: выдаст все выбранные строки в TableB, а также все общие выбранные строки в TableA.

Right Join

Синтаксис:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Примените это в своей таблице Самоле:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

Результат будет:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Полное присоединение

Примечание: это то же самое, что и операция объединения, она вернет все выбранные значения из обеих таблиц.

Full join

Синтаксис:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Примените его в своем примере [таблица le:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

Результат будет:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Некоторые факты

Для ВНУТРЕННИХ присоединений порядок не имеет значения

Для (ЛЕВЫХ, ПРАВИЛЬНЫХ или ПОЛНЫХ) НАРУЖНЫХ объединений порядок имеет значение

Найти больше в w3schools

Ответ 5

select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

Таблица в from в этом примере tableA находится в левой части отношения.

tableA <- tableB
[left]------[right]

Итак, если вы хотите взять все строки из левой таблицы (tableA), даже если в правой таблице нет совпадений (tableB), вы будете использовать "левое соединение".

И если вы хотите взять все строки из правой таблицы (tableB), даже если в левой таблице нет совпадений (tableA), вы будете использовать right join.

Таким образом, следующий запрос эквивалентен приведенному выше.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

Ответ 6

Кажется, вы спрашиваете: "Если я могу переписать RIGHT OUTER JOIN с помощью синтаксиса LEFT OUTER JOIN, то зачем вообще синтаксис RIGHT OUTER JOIN?" Я думаю, что ответ на этот вопрос заключается в том, что разработчики языка не захотели устанавливать такое ограничение для пользователей (и я думаю, что они подверглись бы критике, если бы они это сделали), что заставит пользователей изменить порядок таблиц в предложении FROM в некоторых случаях при простом изменении типа соединения.

Ответ 7

Ваши два утверждения эквивалентны.

Большинство людей используют только LEFT JOIN, поскольку он кажется более интуитивным, и он универсальный синтаксис - я не думаю, что вся поддержка RDBMS RIGHT JOIN.

Ответ 8

Я чувствую, что нам может потребоваться условие AND в разделе where последнего рисунка Outer Excluding JOIN, чтобы мы получили желаемый результат A Union B Minus A Interaction B. Я чувствую, что запрос нужно обновить до

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

Если мы используем OR, то мы получим все результаты A Union B

Ответ 9

выберите * из таблицы 1 left join Table2 на Table1.id = Table2.id

В первом запросе Левое соединение сравнивает левую сторону таблицу таблица1 до правая сторона таблица table2.

В котором будут показаны все свойства table1, тогда как в таблице2 будут показаны только те свойства, в которых условие получится истинным.

выберите * из таблицы 2 right join Table1 в Table1.id = Table2.id

В первом запросе Правое соединение сравнивает правую таблицу таблица1 на левую сторону таблица table2.

В котором будут показаны все свойства table1, тогда как в таблице2 будут показаны только те свойства, в которых условие будет истинным.

Оба запроса дадут тот же результат, потому что порядок объявления таблицы в запросе отличается, как вы объявляете table1 и table2 в слева и справа соответственно в первом левом объединении, а также объявлении table1 и table2 в справа и слева, соответственно, в запросе второго правого соединения.

Вот почему вы получаете одинаковый результат в обоих запросах. Поэтому, если вам нужен другой результат, выполните два этих запроса соответственно,

выберите * из таблицы 1 left join Table2 на Table1.id = Table2.id

выберите * из таблицы 1 right join Table2 на Table1.id = Table2.id

Ответ 10

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id По определению: Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id выбирает все столбцы, упомянутые с ключевым словом "select" из таблицы 1, и столбцы из таблицы 2, которые соответствуют критериям после "on" ключевое слово.

Аналогично, по определению: правое объединение выбирает все столбцы, упомянутые с ключевым словом "select" из таблицы 2, и столбцы из таблицы 1, которые соответствуют критериям после ключевого слова "on".

Обращаясь к вашему вопросу, идентификаторы в обеих таблицах сравниваются со всеми столбцами, которые необходимо добавить в выходные данные. Итак, идентификаторы 1 и 2 являются общими в обеих таблицах, и в результате вы получите четыре столбца с столбцами идентификаторов и имен из первой и второй таблиц по порядку.

*select * from Table1 left join Table2 on Table1.id = Table2.id

Вышеупомянутое выражение, оно берет все записи (строки) из таблицы 1 и столбцы, с совпадающими идентификаторами из таблицы 1 и таблицы 2, из таблицы 2.

select * from Table2 right join Table1 on Table1.id = Table2.id**

Аналогично вышеприведенному выражению, он берет все записи (строки) из таблицы 1 и столбцов с совпадающими идентификаторами из таблицы 1 и таблицы 2 из таблицы 2. (помните, что это правильное соединение, поэтому все столбцы из таблицы 2, а не из таблицы1 будет рассмотрено).

Ответ 11

Я запускал это на сервере sql, и он получал те же результаты. B LEFT JOIN A = A RIGHT JOIN B. Только причина, по которой я мог понять, "Простота использования и удобства".