Разница между левым соединением и правым соединением в 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.
Ответ 2
Codeproject имеет это изображение, которое объясняет простые основы соединений SQL, взятых из: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
![SQL joins explained SQL joins explained]()
Ответ 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. Только причина, по которой я мог понять, "Простота использования и удобства".