Sự khác biệt giữa tham gia trái và tham gia phải trong SQL Server


225

Tôi biết về việc tham gia trong SQL Server.

Ví dụ. Có hai bảng Table1, Table2.

Cấu trúc bảng của họ là như sau.

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

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

Dữ liệu bảng 1 như sau:

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

Dữ liệu bảng 2 như sau:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Nếu tôi thực thi cả hai câu lệnh SQL được đề cập bên dưới, cả hai kết quả đầu ra sẽ giống nhau

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

Vui lòng giải thích sự khác biệt giữa tham gia trái và phải trong các câu lệnh SQL ở trên.

Câu trả lời:


73
Select * from Table1 left join Table2 ...

Select * from Table2 right join Table1 ...

thực sự là hoàn toàn có thể thay thế cho nhau. Tuy nhiên, hãy thử Table2 left join Table1(hoặc cặp giống hệt của nó Table1 right join Table2) để thấy sự khác biệt. Truy vấn này sẽ cung cấp cho bạn nhiều hàng hơn, vì Bảng 2 chứa một hàng có id không có trong Bảng1.


17
Vậy tại sao chúng ta cần RIGHT JOINnếu chúng ta có thể đạt được bất kỳ kết quả mong muốn nào chỉ với LEFT JOIN? : P
user1857492

1
@SilapAliyev Đó thực sự là một câu hỏi hay. Bất cứ ai có thể trả lời? : D
Ian Chu Te

21
Select * from Table1 left join Table 2sẽ trả về TẤT CẢ các bản ghi của bảng 1 cộng với các bản ghi trùng khớp của Bảng 2. Ngược lại Select * from Table1 right join Table 2sẽ trả về TẤT CẢ các bản ghi từ Bảng 2 và các bản ghi trùng khớp của Bảng 1. Hy vọng nó có ích.
Chương trình Adagal

3
nếu bạn sử dụng nhiều hơn 2 bảng, sử dụng tham gia đúng có thể có ý nghĩa và có thể đọc được
ʞɔIɥʇɹɐʞ ouɐɯ

1
@MarkusMeskanen bạn đang thay đổi một câu đơn giản gồm 7 từ. Khi bạn có một câu 35 dòng với nhiều phần phụ và cần thay đổi logic của Left Right, bạn sẽ tự hỏi thay đổi nó chỉ bằng oneword ...
Programador Adagal

1014

Codeproject có hình ảnh này giải thích các khái niệm cơ bản đơn giản về các phép nối SQL, được lấy từ: http://www.codeproject.com/KB/database/Visual_Query_Joins.aspx SQL tham gia giải thích


64
Không có nhiều "chi tiết" trong đó. Tín dụng thực sự nên đi đến trang mã thay vì cho tôi. Nhưng tất nhiên tôi không bận tâm đến sự chú ý :-)
Daan Timmer

6
@Daan Timmer không, cũng phải có tín dụng cho bạn! Bạn đóng gói lại và bán lại để đáp ứng một nhu cầu cụ thể và cụ thể. Các nhà bán lẻ cũng làm như vậy và nhận được hàng tỷ đô la
BKSpurgeon

Tôi cảm thấy chúng ta có thể yêu cầu điều kiện "VÀ" trong đó mệnh đề của hình cuối cùng của "Ngoại trừ THAM GIA". Tôi cảm thấy truy vấn cần được cập nhật thành CHỌN <select_list> TỪ Bảng_A MỘT ĐẦY ĐỦ HOÀN TOÀN Bảng_B B ON A.Key = B.Key WHERE A.Key IS NULL VÀ B.Key IS NULL
vinsinraw

@vinsinraw không cần thiết. Bởi vì điều đó đã được bao phủ bởi điều kiện : JOIN Table_B b ON A.Key = B.Key. Điều kiện OR hoạt động tốt.
Daan Timmer

Đây là một lạm dụng phổ biến của biểu đồ Venn. Các vòng tròn A & B không đại diện cho các bảng A & B, vòng tròn A là A TRÁI PHIẾU B & C B B là một QUYỀN THAM GIA B. Ngoài ra, điều kiện ON là gì và các khóa không liên quan & WHERE không hoạt động trường hợp Xem ý kiến ​​và câu trả lời của tôi trên trang nàyphần này sơ đồ Re Venn .
philipxy

37

Bảng mà bạn đang lấy dữ liệu là 'TRÁI'.
Bảng bạn đang tham gia là 'QUYỀN'.
THAM GIA TRÁI: Lấy tất cả các mục từ bảng bên trái VÀ (chỉ) các mục phù hợp từ bảng bên phải.
THAM GIA QUYỀN: Lấy tất cả các mục từ bảng bên phải VÀ (chỉ) các mục phù hợp từ bảng bên trái.
Vì thế:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

cho:

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

nhưng:

Select * from Table1 right join Table2 on Table1.id = Table2.id

cho:

Id     Name       
-------------  
1      A          
2      B   
3      C  

bạn đã tham gia bảng phải với ít hàng hơn trên bảng có nhiều hàng

một lần nữa, bảng tham gia bên trái có ít hàng trên bảng có nhiều hàng hơn
Hãy thử:

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

22

(GIỚI THIỆU) THAM GIA: Trả về các bản ghi có giá trị khớp trong cả hai bảng.

TRÁI (NGOÀI) THAM GIA: Trả lại tất cả các bản ghi từ bảng bên trái và các bản ghi khớp từ bảng bên phải.

RIGHT (OUTER) THAM GIA: Trả lại tất cả các bản ghi từ bảng bên phải và các bản ghi khớp từ bảng bên trái.

FULL (OUTER) THAM GIA: Trả lại tất cả các bản ghi khi có một trận đấu trong bảng bên trái hoặc bên phải

Ví dụ: giả sử chúng ta có hai bảng với các bản ghi sau:

Bảng A

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

Bảng B

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

Tham gia nội bộ

Lưu ý: Nó cho giao điểm của hai bảng.

Tham gia nội bộ

Cú pháp

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Áp dụng nó trong bảng mẫu của bạn:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

Kết quả sẽ là:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Chỗ nối bên trái

Lưu ý: sẽ cung cấp cho tất cả các hàng được chọn trong TableA, cộng với bất kỳ hàng được chọn phổ biến nào trong TableB.

Chỗ nối bên trái

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

Áp dụng nó trong bảng mẫu của bạn

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

Kết quả sẽ là:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Phải tham gia

Lưu ý: sẽ cung cấp cho tất cả các hàng được chọn trong TableB, cộng với bất kỳ hàng được chọn phổ biến nào trong TableA.

Phải tham gia

Cú pháp:

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

Áp dụng nó trong bảng samole của bạn:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

Kết quả sẽ bw:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Tham gia đầy đủ

Lưu ý: Nó giống như hoạt động hợp nhất, nó sẽ trả về tất cả các giá trị được chọn từ cả hai bảng.

Tham gia đầy đủ

Cú pháp:

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

Áp dụng nó trong samp của bạn [le bảng:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

Kết quả sẽ là:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Một số sự thật

Đối với INNER tham gia đơn hàng không thành vấn đề

Đối với OUTER (TRÁI, PHẢI hoặc ĐẦY ĐỦ) tham gia, vấn đề thứ tự

Tìm thêm tại w3schools


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

Bảng trong fromví dụ này tableA, nằm ở bên trái của mối quan hệ.

tableA <- tableB
[left]------[right]

Vì vậy, nếu bạn muốn lấy tất cả các hàng từ bảng bên trái ( tableA), ngay cả khi không có kết quả khớp nào trong bảng bên phải ( tableB), bạn sẽ sử dụng "nối trái".

Và nếu bạn muốn lấy tất cả các hàng từ bảng bên phải ( tableB), ngay cả khi không có kết quả khớp nào trong bảng bên trái ( tableA), bạn sẽ sử dụng right join.

Do đó, truy vấn sau tương đương với truy vấn được sử dụng ở trên.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

Có vẻ như bạn đang hỏi: "Nếu tôi có thể viết lại một cú pháp RIGHT OUTER JOINbằng cách sử dụng LEFT OUTER JOINthì tại sao lại có một RIGHT OUTER JOINcú pháp?" Tôi nghĩ rằng câu trả lời cho câu hỏi này là bởi vì các nhà thiết kế ngôn ngữ không muốn hạn chế người dùng như vậy (và tôi nghĩ họ sẽ bị chỉ trích nếu họ làm vậy), điều đó sẽ buộc người dùng thay đổi thứ tự các bảng trong FROMmệnh đề trong một số trường hợp khi chỉ thay đổi loại tham gia.


đôi khi các kết nối bên trái và bên phải hoàn toàn có thể thay thế cho nhau, đúng không?
ア レ ッ

4
@Alex: thực sự các liên kết ngoài trái và phải luôn có thể thay thế cho nhau.
onedaywhen

8

Hai tuyên bố của bạn là tương đương.

Hầu hết mọi người chỉ sử dụng LEFT JOINvì nó có vẻ trực quan hơn và đó là cú pháp phổ quát - Tôi không nghĩ rằng tất cả hỗ trợ RDBMS RIGHT JOIN.


"Tôi không nghĩ rằng tất cả RDBMS đều hỗ trợ RIGHT THAM GIA" - chắc chắn, không phải tất cả các RDBMS đều hỗ trợ SQL. Nhưng nếu bạn đang ngụ ý rằng một số sản phẩm SQL hỗ trợ LEFTnhưng không RIGHTthì vui lòng cho biết những sản phẩm nào.
ngày

10
@encedaywhen Ví dụ: SQLite 3 không triển khai RIGHTFULL OUTER JOIN : sqlite.org/omited.html
Mac_Cain13

0

Tôi cảm thấy chúng tôi có thể yêu cầu ANDđiều kiện trong wheređiều khoản của hình cuối cùng Outer Excluding JOINđể chúng tôi có được kết quả mong muốn A Union B Minus A Interaction B. Tôi cảm thấy cần phải cập nhật truy vấn

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

Nếu chúng tôi sử dụng OR, chúng tôi sẽ nhận được tất cả các kết quả củaA Union B


0

chọn * từ Table1 bên trái tham gia Table2 trên Table1.id = Table2.id

Trong truy vấn đầu tiên Left tham gia so sánh trái chiều bảng table1 để ngay mặt bảng table2 .

Trong đó tất cả các thuộc tính của bảng1 sẽ được hiển thị, trong khi trong bảng2, chỉ các thuộc tính đó sẽ được hiển thị trong điều kiện nào là đúng.

chọn * từ Table2 ngay, tham gia Table1 trên Table1.id = Table2.id

Trong truy vấn đầu tiên Phải tham gia so sánh bảng bên phải1 với bảng bên trái2 .

Trong đó tất cả các thuộc tính của bảng1 sẽ được hiển thị, trong khi trong bảng2, chỉ các thuộc tính đó sẽ được hiển thị trong điều kiện nào là đúng.

Cả hai truy vấn sẽ cho cùng một kết quả vì thứ tự khai báo bảng trong truy vấn khác nhau giống như bạn đang khai báo bảng1bảng2bên trái và bên phải trong truy vấn nối trái đầu tiên và cũng khai báo bảng1bảng2bên phải và bên trái trong lần nối bên phải thứ hai truy vấn.

Đây là lý do tại sao bạn nhận được cùng một kết quả trong cả hai truy vấn. Vì vậy, nếu bạn muốn kết quả khác nhau, hãy thực hiện hai truy vấn này tương ứng,

chọn * từ Table1 bên trái tham gia Table2 trên Table1.id = Table2.id

chọn * từ Table1 ngay tham gia Table2 trên Table1.id = Table2.id


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Theo định nghĩa: Left Join chọn tất cả các cột được đề cập với từ khóa "select" từ Bảng 1 và các cột trong Bảng 2 khớp với các tiêu chí sau từ khóa "bật".

Tương tự, theo định nghĩa: Right Join chọn tất cả các cột được đề cập với từ khóa "select" từ Bảng 2 và các cột trong Bảng 1 khớp với các tiêu chí sau từ khóa "bật".

Đề cập đến câu hỏi của bạn, id trong cả hai bảng được so sánh với tất cả các cột cần được ném vào đầu ra. Vì vậy, IDS 1 và 2 là phổ biến trong cả hai bảng và kết quả là trong kết quả bạn sẽ có bốn cột với idtên cột từ đầu tiênthứ hai bảng theo thứ tự.

*select * from Table1 left join Table2 on Table1.id = Table2.id

Biểu thức trên, nó lấy tất cả các bản ghi (hàng) từ bảng 1 và cột, với id khớp từ bảng 1 và bảng 2, từ bảng 2.

select * from Table2 right join Table1 on Table1.id = Table2.id**

Tương tự như biểu thức trên, nó lấy tất cả các bản ghi (hàng) từ bảng 1 và cột, với id khớp từ bảng 1 và bảng 2, từ bảng 2. (hãy nhớ rằng đây là một phép nối đúng nên tất cả các cột từ bảng2 chứ không phải từ bảng1 sẽ được xem xét).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.