Різниця між лівим приєднанням та правим приєднанням у SQL Server


225

Я знаю про приєднання до SQL Server.

Наприклад. Є дві таблиці Таблиця1, Таблиця2.

Їх структури столів такі.

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), щоб побачити різницю. Цей запит повинен дати вам більше рядків, оскільки таблиця2 містить рядок з ідентифікатором, якого немає в таблиці1.


17
То навіщо нам це потрібно, RIGHT JOINякщо ми можемо досягти бажаного результату просто LEFT JOIN? : P
користувач1857492

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
@Daan Timmer ні, має бути і кредит на вас! Ви переупаковуєте та перепродаєте, щоб задовольнити конкретний та особливий попит. Роздрібні торговці роблять те саме і отримують $$ мільярди
BKSpurgeon

Я відчуваю, що ми можемо вимагати умови "І", коли пункт останньої цифри "Зовнішній виключаючи ПРИЄДНАЙТЕСЬ". Я відчуваю, що запит потрібно оновити до ВИБІР <select_list> ВІД Таблиці_А ПОВНОГО ВІДПОЛУЧЕННЯ Таблиця_B B НА A.Key = B. KEY WHERE A.Key NULL AND B.Key IS NULL
vinsinraw

@vinsinraw, який не потрібен. Тому що вже охоплюється умовою: JOIN Table_B b ON A.Key = B.Key. АБО стан працює добре.
Даан Тіммер

Це звичайне зловживання діаграмами Венна. Кола A & B не представляють таблиці A & B, коло A - ЛІВНЕ ПРИЄДНАЙТЕСЬ B & Cirlce B - ПРАВО ПРИЄДНАЙТЕСЬ B. Також не має значення, що умова ON і клавіші не мають значення & WHERE не працюють кожен справа. Дивіться мої коментарі та відповіді на цій сторінці та в цьому розділі Діаграми Re Venn .
Філіпсі

37

Таблиця, з якої ви берете дані, - "ВЛИВО".
Таблиця, до якої ви приєднуєтесь, - "ПРАВО".
ЛІВО ПРИЄДНАЙТЕСЬ: Візьміть усі елементи з лівої таблиці І (тільки) відповідні елементи з правої таблиці.
ПРАВИЛЬНА ПРИЄДНАЙТЕСЬ: Візьміть усі елементи з правої таблиці І (тільки) відповідні елементи з лівої таблиці.
Так:

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  

22

(INNER) ПРИЄДНАЙТЕСЬ: Повертає записи, які мають відповідні значення в обох таблицях.

ВЛЕВО (ВНУТРІШНІ) ПРИЄДНАЙТЕСЬ: Повертайте всі записи з лівої таблиці, а відповідні записи - з правої таблиці.

ПРАВО (ВНУТРІШНІ) ПРИЄДНАЙТЕСЬ: Повертайте всі записи з правої таблиці, а відповідні записи - з лівої.

ПОВНИЙ (ВНУТРІШНИЙ) ПРИЄДНАЙТЕСЬ: Повертайте всі записи, коли є збіг у лівій чи правій таблиці

Наприклад, припустимо, у нас є дві таблиці із наступними записами:

Таблиця А

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;

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

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;

Застосуйте його у вашій вибірці [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

Деякі факти

Для приєднання до INNER порядок не має значення

Для (Вліво, Вправо або ПОВНО) приєднується OUTER, порядок має значення

Знайдіть більше в 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

10

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


іноді лівий і правий зовнішні з'єднання повністю взаємозамінні, правда?
ア レ ッ ク ス

4
@ Алекс: дійсно лівий і правий зовнішні з'єднання завжди взаємозамінні.
одного дня, коли

8

Ваші два твердження рівноцінні.

Більшість людей користуються лише LEFT JOINтим, що здається більш інтуїтивно зрозумілим, і це універсальний синтаксис - я не думаю, що підтримують всі RDBMS RIGHT JOIN.


"Я не думаю, що всі RDBMS підтримують ПРАВО ПРИЄДНАЙТЕСЬ" - впевнений, що не всі RDBMS підтримують SQL. Але якщо ви маєте на увазі, що деякі продукти SQL підтримують, LEFTале не RIGHTтоді, вкажіть, які саме.
одного дня, коли

10
@onedaywhen Наприклад, SQLite 3 не реалізує RIGHTі FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13

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

виберіть * з таблиці1 зліва приєднати таблицю2 до таблиці1.id = table2.id

У першому запиті лівого з'єднання порівнює лівобічні таблиці table1 з правостороннім столом table2 .

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

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

У першому запиті з'єднання справа порівнює правостороннім таблиці table1 для лівостороннього столу table2 .

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

Обидва запит дає однаковий результат , тому що порядок таблиця декларації в запиті різний , як ви оголошуєте table1 і таблица2 в лівому і правому , відповідно , в першому зліва приєднатися запитом, а також оголосити table1 і таблица2 в правому і лівому відповідно другий праворуч приєднатися запит.

Це причина, чому ви отримуєте однаковий результат в обох запитах. Тож якщо ви хочете іншого результату, виконайте ці два запити відповідно,

виберіть * з таблиці1 зліва приєднати таблицю2 до таблиці1.id = table2.id

виберіть * з таблиці1 праворуч приєднати таблицю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".

Аналогічно, за визначенням: Right Join вибирає всі стовпці, згадані ключовим словом "select" з Таблиці 2, та стовпці з таблиці 1, які відповідають критеріям після ключового слова "on".

Посилаючись на своє запитання, ідентифікатори в обох таблицях порівнюються з усіма стовпцями, необхідними для викидання у висновок. Отже, ідентифікатори 1 і 2 є загальними для обох таблиць, і в результаті в результаті у вас з'являться чотири стовпці з стовпцями id і імен з першої та другої таблиць у порядку.

*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. (Пам'ятайте, це правильне з'єднання, тому всі стовпці з table2, а не з таблиці1 буде розглянуто).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.