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

225

Я знаю о соединениях в 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.

Панкадж Агарвал
источник

Ответы:

73
Select * from Table1 left join Table2 ...

и

Select * from Table2 right join Table1 ...

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

Петер Тёрёк
источник
17
Так зачем нам, RIGHT JOINесли мы можем добиться любого желаемого результата просто LEFT JOIN? : P
user1857492 15.12.15
1
@SilapAliyev Это на самом деле очень хороший вопрос. Кто-нибудь может ответить? : D
Ян Чу Те
21
Select * from Table1 left join Table 2вернет ВСЕ записи таблицы 1 плюс совпадающие записи таблицы 2. Обратное Select * from Table1 right join Table 2вернет ВСЕ записи из таблицы 2 и совпадающие записи таблицы 1. Надеется, что это поможет.
Programador Adagal
3
если вы используете более 2 таблиц, правильное объединение может быть значимым и читабельным
ɥʇɹɐʞıɥʇɹɐʞ ouɐɯ
1
@MarkusMeskanen вы меняете простое предложение из 7 слов. Когда у вас есть предложение из 356 строк с несколькими субстанциями и вам нужно изменить логику левого и правого каналов, вы удивитесь, изменив его только на одну фразу ...
Programador Adagal
1014

У Codeproject есть это изображение, которое объясняет простые основы соединений SQL, взятые из: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL присоединяется объяснил

Даан Тиммер
источник
64
Там не так много «деталей». Кредит должен на самом деле перейти на страницу кода проекта, а не мне. Но я, конечно, не против внимания :-)
Даан Тиммер
6
@ Даан Тиммер: нет, тебе тоже нужно отдать должное! Вы переупаковываете и перепродаете, чтобы удовлетворить конкретный и конкретный спрос. Ритейлеры делают то же самое и получают миллиарды долларов
BKSpurgeon
Я чувствую, что нам может потребоваться условие «И» в предложении where последней цифры «Внешнее исключая JOIN». Я чувствую, что запрос должен быть обновлен до SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key, где A.KEY равен NULL, а B.Key равен NULL
vinsinraw
@vinsinraw, который не нужен. Потому что уже охватывается условием: JOIN Table_B b ON A.Key = B.Key. Условие ИЛИ работает просто отлично.
Даан Тиммер
Это распространенное злоупотребление диаграммами Венна. Круги A и B не представляют таблицы A и B, кружок A - это ЛЕВОЕ СОЕДИНЕНИЕ B, а cirlce B - ПРАВИЛЬНОЕ СОЕДИНЕНИЕ B. Кроме того, не имеет значения, что является состоянием ON, ключи не имеют значения, и WHERE не работают каждый кейс. Смотрите мои комментарии и ответы на этой странице и в этом разделе .
philipxy
37

Таблица, из которой вы берете данные - «ВЛЕВО».
Таблица, к которой вы присоединяетесь, «ПРАВАЯ».
LEFT JOIN: взять все элементы из левой таблицы и (только) соответствующие элементы из правой таблицы.
ПРАВИЛЬНОЕ СОЕДИНЕНИЕ: Возьмите все предметы из правой таблицы И (только) соответствующие предметы из левой таблицы.
Так:

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  
vbole
источник
22

(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

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

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

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

Синтаксис

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.

Левый присоединиться

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.

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

Синтаксис:

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

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

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

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

Синтаксис:

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

Примените его в своем примере

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

Сушанк Покхарел
источник
12
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
Moraes
источник
10

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

onedaywhen
источник
иногда левые и правые внешние соединения полностью взаимозаменяемы, верно?
ス レ ッ ク ス
4
@Alex: действительно, левые и правые внешние соединения всегда взаимозаменяемы.
1
8

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

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

JNK
источник
«Я не думаю, что все RDBMS поддерживают RIGHT JOIN», - конечно, не все RDBMS поддерживают SQL. Но если вы подразумеваете, что некоторые продукты SQL поддерживают, LEFTно не поддерживают, RIGHTукажите, какие из них.
1
10
@onedaywhen Например, SQLite 3 не реализует RIGHTи FULL OUTER JOIN : sqlite.org/omited.html
Mac_Cain13 13.12.12
0

Я чувствую, что мы можем потребовать 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

vinsinraw
источник
0

выберите * из таблицы1 слева присоединиться к таблице2 на Table1.id = Table2.id

В первом запросе Left join сравнивает левую таблицу table1 с правой таблицей table2 .

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

выберите * из таблицы 2 справа присоединиться к таблице 1 на Table1.id = Table2.id

В первом запросе Right join сравнивает правую таблицу table1 с левой таблицей table2 .

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

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

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

выберите * из таблицы1 слева присоединиться к таблице2 на Table1.id = Table2.id

выберите * из таблицы Table1 справа присоединиться к таблице 2 на Table1.id = Table2.id

Нисарг шах
источник
0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id По определению: Left Join выбирает все столбцы, упомянутые с ключевым словом «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 будет рассмотрено).

VDWWD
источник