2011-01-17 15 views
196

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

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

Существует структура таблицы.

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

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

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

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

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

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 

Пожалуйста, e xplain различие между левым и правым соединением в выше sql-операторах.

ответ

66
Select * from Table1 left join Table2 ... 

и

Select * from Table2 right join Table1 ... 

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

+13

Итак, зачем нам« ПРАВОЕ СОЕДИНЕНИЕ », если мы сможем достичь каких-либо желаемый результат с помощью только «LEFT JOIN»? : P –

+1

@ Силапа Алиев. На самом деле это очень хороший вопрос. Может ли кто-нибудь ответить? : D –

+15

'Select * from Table1 left join Таблица 2' вернет ВСЕ записи таблицы 1 плюс совпадающие записи таблицы 2. Противоположный' Select * from Table1 right join Table 2' должен вернуть ВСЕ записи из Таблицы 2 и совпадающие записи табл. 1. Надеется, что это поможет. –

8

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

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

+0

«Я не думаю, что поддержка RDBMS RIGHT JOIN» - конечно, не все СУБД поддерживают SQL. Но если вы подразумеваете, что некоторые SQL-продукты поддерживают 'LEFT', но не' RIGHT', то укажите, какие из них. – onedaywhen

+9

@onedaywhen Например, SQLite 3 не реализует 'RIGHT' и' FULL OUTER JOIN ': http://www.sqlite.org/omitted.html –

945

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

+42

Это должен быть ответ вместо этого. +1 для подробного ответа. –

+58

Там не так много «деталей». Кредит должен фактически перейти на страницу кодекса вместо меня. Но я, конечно, не против внимания :-) –

+3

отличный ответ. Спасибо. –

9

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

+0

иногда левое и правое внешние соединения полностью взаимозаменяемы, правильно? –

+3

@Alex: действительно левые и правые внешние соединения * всегда * взаимозаменяемы. – onedaywhen

11
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 
+3

Добро пожаловать в переполнение стека. Вы должны очистить систему [форматирование] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks). Кроме того, люди часто комментируют негативно, когда есть ссылка на [W3Schools] (http://w3fools.com/), но это не является ни здесь, ни там, если ссылочная информация действительна, а не против лучших методов кода. – SomeShinyObject

+0

Спасибо за совет ChristopherW, я обращу внимание в следующий раз. С наилучшими пожеланиями. – Moraes

+0

Это лучшее объяснение, которое я когда-либо видел –

37

Таблица, из которой вы берете данные, является «LEFT».
Стол, к которому вы присоединяетесь, является «ПРАВО».
LEFT 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 

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

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

СПАСИБО! «Таблица, из которой вы берете данные, -« LEFT ». Таблица, в которую вы присоединяетесь, -« ПРАВО ». – user25064

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

0

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

В первом запросе левого соединение сравнивает левосторонних стола стол1 до правая сторона стол таблица2.

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

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

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

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

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

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

выберите * из Table1 левое соединение Table2 на Table1.id = table2.id

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

5

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

ВЛЕВО: Верните все записи из левой таблицы и соответствующие записи из правой таблицы.

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

ПОЛНЫЙ (OUTER) РЕГИСТРИРУЙТЕСЬ: Возвращать все записи, когда есть совпадение в левой или правой таблице

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

Таблица

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 Регистрация

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

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 

Left Регистрация

Примечание: даст все выбранные строки в 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 

Right Регистрация

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

Right Join

Синтаксис:

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

Применить его в samole таблице:

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; 

Применить его в SAMP [ле таблицы:

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 

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

Для внутренних соединений, порядок не имеет значения

Для (влево, вправо или FULL) OUTER присоединяется, порядок дело

Найти ещё на w3schools

0

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

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

Ссылаясь на ваш вопрос, идентификатор в обеих таблицах сравнивается со всеми столбцами, необходимыми для вывода на выходе. Таким образом, идентификаторы 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 и столбцов, с сопоставлением id из таблицы 1 и таблицы 2 из таблицы 2. (помните, что это правое соединение, так что все столбцы ns из таблицы2, а не из таблицы 1).

Смежные вопросы