THAM GIA TRÁI PHẢI so với LEFT OUTER THAM GIA trong SQL Server


1595

Sự khác biệt giữa LEFT JOINvà là LEFT OUTER JOINgì?


213
Không ai! Các OUTERtừ khóa là tùy chọn.
jarlh

9
Biểu đồ Venn không thích hợp để trả lời cho câu hỏi này. Câu trả lời cho câu hỏi này là Không có . Xem bình luận đầu tiên.
philipxy

3
Biểu đồ Venn minh họa sự khác biệt trong các hàng đầu ra cho các trường hợp đặc biệt của nối bên trong và bên ngoài . Nếu không có hàng rỗng hoặc hàng trùng lặp nào được nhập vào (vì vậy chúng ta có thể lấy một bảng thành một tập hợp các giá trị có giá trị hàng & sử dụng phương trình toán học bình thường), sau đó các vòng tròn trái và phải giữ các bảng / bộ kết nối trái & phải . Nhưng nếu null hoặc các hàng trùng lặp là đầu vào thì rất khó để giải thích những gì các vòng tròn là tập hợp và cách các tập hợp đó liên quan đến các bảng / túi đầu vào và đầu ra mà sơ đồ Venn không hữu ích. Xem ý kiến ​​của tôi ở đây lại lạm dụng biểu đồ Venn khác.
philipxy

Câu trả lời:


2237

Theo tài liệu: TỪ (Transact-SQL) :

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Từ khóa OUTERđược đánh dấu là tùy chọn (nằm trong dấu ngoặc vuông). Trong trường hợp cụ thể này, cho dù bạn chỉ định OUTERhay không không có sự khác biệt. Lưu ý rằng trong khi các yếu tố khác của join khoản cũng được đánh dấu là không bắt buộc, để lại chúng ra sẽ tạo sự khác biệt.

Chẳng hạn, toàn bộ phần loại của JOINmệnh đề là tùy chọn, trong trường hợp đó là mặc định INNERnếu bạn chỉ định JOIN. Nói cách khác, đây là hợp pháp:

SELECT *
FROM A JOIN B ON A.X = B.Y

Dưới đây là danh sách các cú pháp tương đương:

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

Ngoài ra hãy xem câu trả lời tôi để lại cho câu hỏi SO khác này: SQL có tham gia so với nhiều bảng trên dòng TỪ không? .

nhập mô tả hình ảnh ở đây


135
Chuẩn xác. OUTER được phép tương thích ANSI-92.
Sean Reilly

11
@ LasseV.Karlsen sẽ không tốt hơn nếu có INNER JOINbên phải và chỉ JOINbên trái trong danh sách tương đương?
nawfal

8
@ LasseV.Karlsen Tôi chỉ có nghĩa là bên trái có hình thức súc tích và bên phải có hình thức mở rộng. Tôi nghĩ rằng nó sẽ làm cho nó mạch lạc nếu bạn cũng làm theo như vậy cho JOINs.
nawfal

30
@ Trước đó Đó là đặc quyền của bạn, nhưng rõ ràng 451 người khác nghĩ rằng câu trả lời là tốt. Thành thật mà nói, nếu một câu trả lời nói X và một câu trả lời khác nói X và tham chiếu tài liệu, cũng như sao chép các phần có liên quan của tài liệu vào câu trả lời, phiếu bầu của tôi sẽ chuyển sang câu trả lời thứ hai và đó là lý do tôi viết câu trả lời của mình theo cách Tôi làm. Rằng ai đó tuyên bố X không tốt. Nếu bạn có thể chứng minh X, điều đó tốt hơn (không phải câu trả lời của sactiw nhẹ). Nhưng, đó là đặc quyền của bạn để suy nghĩ bất cứ điều gì bạn muốn. Tôi hỏi tại sao bạn nghĩ rằng nó là vô nghĩa, mặc dù câu trả lời là sai?
Lasse V. Karlsen

7
@ Trước đó và thành thật mà nói, nếu bạn không muốn đọc câu trả lời "dài" của tôi, thì câu trả lời của tôi không dành cho bạn. Nó dành cho những người khác đến đây tự hỏi về điều tương tự và muốn có một số thông tin về lý do tại sao, và nơi để tìm thêm thông tin, v.v ... Rõ ràng bạn là kiểu người sẽ muốn câu trả lời này: "Không", nhưng thật không may không phải là một câu trả lời hợp pháp ở đây trên Stack Overflow, cũng không nên như vậy.
Lasse V. Karlsen

700

Để trả lời câu hỏi của bạn , không có sự khác biệt giữa LEFT THAM GIA và LEFT OUTER THAM GIA, chúng giống hệt như đã nói ...

Ở cấp độ cao nhất, chủ yếu có 3 loại tham gia:

  1. BÊN TRONG
  2. NGOÀI
  3. VƯỢT QUA

  1. INNER THAM GIA - tìm nạp dữ liệu nếu có trong cả hai bảng.

  2. THAM GIA NGOÀI3 loại:

    1. LEFT OUTER JOIN - tìm nạp dữ liệu nếu có trong bảng bên trái.
    2. RIGHT OUTER JOIN - tìm nạp dữ liệu nếu có trong bảng bên phải.
    3. FULL OUTER JOIN - tìm nạp dữ liệu nếu có trong một trong hai bảng.
  3. CROSS THAM GIA , như tên cho thấy, điều [n X m]đó kết hợp mọi thứ với mọi thứ.
    Tương tự như kịch bản trong đó chúng ta chỉ liệt kê các bảng để tham gia (trong FROMmệnh đề của SELECTcâu lệnh), sử dụng dấu phẩy để phân tách chúng.


Những điểm cần lưu ý:

  • Nếu bạn chỉ đề cập JOINthì theo mặc định nó là một INNER JOIN.
  • Một OUTERtham gia phải được LEFT| RIGHT| FULLbạn không thể nói một cách đơn giản OUTER JOIN.
  • Bạn có thể thả OUTERtừ khóa và chỉ nói LEFT JOINhay RIGHT JOINhay FULL JOIN.

Đối với những người muốn trực quan hóa những điều này theo cách tốt hơn, vui lòng truy cập liên kết này: Giải thích trực quan về các tham gia SQL


17
Câu trả lời rất hay. Sẽ rõ ràng hơn nếu bạn nói "LEFT OUTER THAM GIA - tìm nạp tất cả dữ liệu từ bảng bên trái với dữ liệu khớp từ bên phải, nếu được đặt trước." cho 2.1 (và thay đổi tương tự cho 2.2)
ssh

1
Ngoài ra, bạn có thể thực hiện tham gia chéo bằng cách đơn giản là 'chọn * từ TableA, TableB'
om471987

3
Xin lỗi nếu tôi bị hoại tử, nhưng CROSS JOINgiống như FULL JOIN?
TechnicalTophat

9
@RhysO không, CROSS THAM GIA là một sản phẩm của Cartesian, tức là CROSS THAM GIA của một bảng, có n hàng, với một bảng, có m hàng, sẽ luôn cho (n * m) hàng trong khi FULL OUTER THAM GIA của một bảng, có n hàng, với một bảng, có m hàng, sẽ cho tối đa (n + m) hàng
sactiw

1
@sactiw xem xét để thêm một ghi chú đặc biệt trong câu trả lời có giá trị của bạn về sự khác biệt giữa Cross JoinFull Outer Join... theo một cách nào đó có vẻ tương tự nhau.
Manuel Jordan

356

Sự khác biệt giữa tham gia trái và tham gia ngoài trái là gì?

Không có gì . LEFT JOINLEFT OUTER JOINlà tương đương.


13
xin chào! ai đã bỏ phiếu này? THAM GIA TRÁI PHIẾU giống như TRÁI PHIẾU TRÁI PHIẾU.
Mitch Wheat

7
Đây là trường hợp trong Microsoft SQL Server và bất kỳ RDBMS tuân thủ SQL nào khác.
Bill Karwin

7
Sẽ thật tuyệt nếu bạn thêm một tài liệu tham khảo hoặc giải thích về lý do tại sao OUTERlà tùy chọn.
Zero3

7
Câu trả lời ngắn gọn, chính xác nhất ở đây.
Manachi

4
Cảm ơn bạn. Câu trả lời được chấp nhận có quá nhiều thông tin khiến tôi bối rối hơn. Đây chính xác là những gì tôi cần biết và trả lời thẳng câu hỏi ban đầu.
Bacon Brad

66

Tôi là một DBA PostgreSQL, theo như tôi có thể hiểu sự khác biệt giữa sự khác biệt bên ngoài hoặc không tham gia bên ngoài là một chủ đề có thảo luận đáng kể trên internet. Cho đến hôm nay tôi chưa bao giờ thấy sự khác biệt giữa hai điều đó; Vì vậy, tôi đã đi xa hơn và tôi cố gắng tìm sự khác biệt giữa những người đó. Cuối cùng, tôi đọc toàn bộ tài liệu về nó và tôi đã tìm thấy câu trả lời cho điều này,

Vì vậy, nếu bạn xem tài liệu (ít nhất là trong PostgreSQL), bạn có thể tìm thấy cụm từ này:

"Những lời INNEROUTERkhông bắt buộc dưới mọi hình thức. INNERĐược mặc định; LEFT, RIGHTFULLbao hàm một bên ngoài tham gia."

Nói cách khác,

LEFT JOINvà là LEFT OUTER JOINCÙNG

RIGHT JOINvà là RIGHT OUTER JOINCÙNG

Tôi hy vọng nó có thể là một đóng góp cho những người vẫn đang cố gắng tìm câu trả lời.


60

Left JoinLeft Outer Joinlà một và giống nhau . Cái trước là tốc ký cho cái sau. Điều tương tự có thể được nói về Right JoinRight Outer Joinmối quan hệ. Các cuộc biểu tình sẽ minh họa sự bình đẳng. Các ví dụ hoạt động của từng truy vấn đã được cung cấp qua SQL Fiddle . Công cụ này sẽ cho phép thực hiện các thao tác truy vấn.

Được

nhập mô tả hình ảnh ở đây

Tham gia tráiTham gia ngoài trái

nhập mô tả hình ảnh ở đây

Các kết quả

nhập mô tả hình ảnh ở đây


Phải tham giaphải tham gia bên ngoài

nhập mô tả hình ảnh ở đây

Các kết quả

nhập mô tả hình ảnh ở đây


43

Tôi thấy dễ dàng hơn khi nghĩ về Joins theo thứ tự sau:

  • CROSS THAM GIA - một sản phẩm của Cartesian của cả hai bảng. TẤT CẢ tham gia bắt đầu từ đây
  • THAM GIA THAM GIA - THAM GIA CROSS với bộ lọc được thêm vào.
  • OUTER THAM GIA - một THAM GIA VÀO với các yếu tố bị thiếu (từ bảng TRÁI hoặc PHẢI) được thêm vào sau đó.

Cho đến khi tôi tìm ra mô hình đơn giản (tương đối) này, THAM GIA luôn là một nghệ thuật đen hơn một chút. Bây giờ họ có ý nghĩa hoàn hảo.

Hy vọng điều này sẽ giúp nhiều hơn nó nhầm lẫn.


Điều này không trả lời câu hỏi.
philipxy

33

Tại sao LEFT / RIGHT và LEFT OUTER / RIGHT OUTER giống nhau? Hãy giải thích tại sao từ vựng này. Hiểu rằng các phép nối LEFT và RIGHT là các trường hợp cụ thể của phép nối OUTER, và do đó không thể là bất cứ điều gì khác ngoài OUTER LEFT / OUTER RIGHT. Tham gia OUTER cũng được gọi là FULL OUTER trái ngược với tham gia TRÁI và PHẢI là kết quả THAM GIA của tham gia OUTER. Thật:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

Bây giờ rõ ràng tại sao các hoạt động đó có bí danh, cũng như rõ ràng chỉ có 3 trường hợp tồn tại: INNER, OUTER, CROSS. Với hai trường hợp phụ cho OUTER. Từ vựng, cách giáo viên giải thích điều này, cũng như một số câu trả lời ở trên, thường làm cho có vẻ như có rất nhiều loại tham gia khác nhau. Nhưng nó thực sự rất đơn giản.


1
"rõ ràng chỉ có 3 trường hợp tồn tại": thú vị nhưng thiếu sót. Hãy xem xét rằng một phép nối bên trong là một phép nối chéo chuyên biệt (nghĩa là di chuyển các biến vị ngữ đến mệnh đề where). Xem xét thêm rằng tham gia bên ngoài hoàn toàn không phải là tham gia, thay vào đó là một liên kết nơi các null được sử dụng thay cho các cột 'mất tích'. Do đó, có thể lập luận rằng cross là tham gia duy nhất cần thiết. Lưu ý suy nghĩ hiện tại trong lý thuyết quan hệ là tham gia tự nhiên thỏa mãn tất cả các yêu cầu tham gia. Ngoài ra: bạn có thể giải thích nếu / làm thế nào từ " JOINngụ ý INNER JOIN" phù hợp với lý do của bạn cho vocab tham gia bên ngoài?
onedaywhen ngày

27

Để trả lời câu hỏi của bạn

Trong Sql Server, tham gia cú pháp OUTER là tùy chọn

Nó được đề cập trong bài viết msDN: https://msdn.microsoft.com/en-us/l Library / ms177634 (v = sql.130) .aspx

Vì vậy, danh sách sau đây cho thấy tham gia các cú pháp tương đương có và không có OUTER

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

Các cú pháp tương đương khác

INNER JOIN => JOIN
CROSS JOIN => ,

Rất khuyến nghị Dotnet Mob Artice: Tham gia vào Sql Server nhập mô tả hình ảnh ở đây


2
Lạm dụng lại sơ đồ Venn ở đây xem nhận xét của tôi về câu hỏi.
philipxy

20

Chỉ có 3 tham gia:

  • A) Tham gia chéo = Cartesian (Ví dụ: Bảng A, Bảng B)
  • B) Tham gia bên trong = THAM GIA (Ví dụ: Bảng A Tham gia / Bảng tham gia bên trong B)
  • C) Tham gia ngoài:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

Hy vọng nó sẽ giúp.


1
Vì vậy, 5 tham gia hoàn toàn.
Zeek2

19

Chủ yếu có ba loại THAM GIA

  1. Bên trong: tìm nạp dữ liệu, có trong cả hai bảng
    • Chỉ THAM GIA có nghĩa là THAM GIA
  2. Bên ngoài: có ba loại

    • LEFT OUTER - - tìm nạp dữ liệu chỉ có trong bảng bên trái và điều kiện khớp
    • RIGHT OUTER - - tìm nạp dữ liệu chỉ có trong bảng bên phải và điều kiện khớp
    • FULL OUTER - - tìm nạp dữ liệu hiện bất kỳ hoặc cả hai bảng
    • (TRÁI hoặc PHẢI hoặc ĐẦY ĐỦ) OUTER THAM GIA có thể được viết bằng cách viết "OUTER"
  3. Tham gia chéo: tham gia mọi thứ với mọi thứ


16

Đường cú pháp, làm cho người đọc bình thường thấy rõ hơn rằng sự tham gia không phải là một bên trong.


2
Vậy ... THẾ NÀO ĐẦY ĐỦ THAM GIA thì sao?
Amy B

5
bảngA FULL OUTER THAM GIA bảngB sẽ cung cấp cho bạn ba loại bản ghi: tất cả các bản ghi trong bảngA không có bản ghi khớp trong bảngB, tất cả các bản ghi trong bảngB không có bản ghi khớp trong bảngA và tất cả các bản ghi trong bảngA có bản ghi khớp trong bảngB.
Dave DuPlantis

4

Chỉ trong bối cảnh của câu hỏi này, tôi cũng muốn đăng cả hai toán tử 'ỨNG DỤNG':

THAM GIA :

  1. THAM GIA THAM GIA = THAM GIA

  2. THAM GIA

    • LEFT OUTER THAM GIA = THAM GIA TRÁI

    • RIGHT OUTER THAM GIA = RIGHT THAM GIA

    • FULL OUTER THAM GIA = FULL THAM GIA

  3. THAM GIA

TỰ THAM GIA : Đây không chính xác là một loại tham gia riêng biệt. Điều này về cơ bản là nối một bảng với chính nó bằng một trong các phép nối trên. Nhưng tôi cảm thấy nó đáng được đề cập trong bối cảnh thảo luận THAM GIA vì bạn sẽ nghe thấy thuật ngữ này từ nhiều người trong cộng đồng Nhà phát triển SQL.

ÁP DỤNG :

  1. ỨNG DỤNG CROSS - Tương tự như INNER THAM GIA (Nhưng đã thêm lợi thế là có thể tính toán một cái gì đó trong bảng Phải cho mỗi hàng của Bảng bên trái và sẽ chỉ trả về các hàng phù hợp)
  2. ỨNG DỤNG NGOÀI TRỜI - Tương tự như LEFT OUTER THAM GIA (Nhưng đã thêm lợi thế là có thể tính toán một cái gì đó trong bảng Phải cho mỗi hàng của Bảng bên trái và sẽ trả về tất cả các hàng từ Bảng bên trái bất kể trận đấu trên Bảng Phải)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

Ví dụ thực tế, khi nào nên sử dụng OUTER / CROSS ỨNG DỤNG trong SQL

Tôi thấy toán tử ỨNG DỤNG rất có lợi vì chúng cho hiệu năng tốt hơn so với việc phải thực hiện cùng một tính toán trong truy vấn con. Chúng cũng thay thế nhiều chức năng Phân tích trong các phiên bản SQL Server cũ hơn. Đó là lý do tại sao tôi tin rằng sau khi cảm thấy thoải mái với THAM GIA, một nhà phát triển SQL nên cố gắng tìm hiểu các toán tử ỨNG DỤNG tiếp theo.

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.