Разница между левым и правым соединением в SQL Server - PullRequest
216 голосов
/ 17 января 2011

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

Ответы [ 10 ]

993 голосов
/ 17 января 2011

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

71 голосов
/ 17 января 2011
Select * from Table1 left join Table2 ...

и

Select * from Table2 right join Table1 ...

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

37 голосов
/ 22 октября 2013

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

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  
12 голосов
/ 13 мая 2013
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
11 голосов
/ 13 ноября 2017

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

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

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

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

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

Таблица A

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

Таблица B

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

Право на присоединение

Примечание: выдаст все выбранные строки в таблице B, а также все общие выбранные строки в таблице A.

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;

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

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 table:

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

10 голосов
/ 18 января 2011

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

8 голосов
/ 17 января 2011

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

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

0 голосов
/ 14 февраля 2018

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 являются общими в обеих таблицах, и в результате вы получите четыре столбца с id и name столбцами из first и второй таблицы в порядке.

*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).

0 голосов
/ 17 октября 2017

выберите * из таблицы 1. Соединение слева. Таблица 2. Таблица 1.id = Table2.id

. В первом запросе Объединение влево сравнение влево стол стол1 до правосторонний стол стол2 .

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

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

В первом запросе правое объединение сравнивает правое стол стол1 до левосторонний стол стол2 .

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

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

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

select * из Table1, оставьте соединение Table2 на Table1.id = Table2.id

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

0 голосов
/ 22 июня 2016

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

...