LEFT JOIN กับ LEFT OUTER OINTER ใน SQL Server


1595

ความแตกต่างระหว่างLEFT JOINและLEFT OUTER JOINคืออะไร?


213
ไม่มี! OUTERคำหลักที่เป็นตัวเลือก
jarlh

9
เวนไดอะแกรมไม่เหมาะสมสำหรับคำตอบของคำถามนี้ คำตอบของคำถามนี้ก็คือไม่มี ดูความคิดเห็นแรก
philipxy

3
แผนภาพเวนน์แสดงให้เห็นถึงความแตกต่างในแถวที่ส่งออกสำหรับกรณีพิเศษของภายใน VS นอกเข้าร่วม ถ้าไม่มี nulls หรือแถวที่ซ้ำกันมีการป้อนข้อมูล (เพื่อให้เราสามารถใช้ตารางเพื่อเป็นชุดของค่าแถวมูลค่าและใช้ความเท่าเทียมกันทางคณิตศาสตร์ปกติ) แล้วไปทางซ้ายและทางขวาค้างไว้แวดวงตารางการส่งออก / ชุดซ้ายและขวาเข้าร่วม แต่ถ้าโมฆะหรือแถวที่ซ้ำกันเป็นอินพุทก็ยากที่จะอธิบายว่าวงกลมนั้นเป็นอย่างไรและชุดเหล่านั้นเกี่ยวข้องกับอินพุทและเอาท์พุทตาราง / ถุงที่ Venn diagrams ไม่มีประโยชน์อะไร ดูความคิดเห็นของฉันที่นี่อีกแผนภาพเวนน์ละเมิดสิทธิอื่น ๆ
philipxy

คำตอบ:


2237

ตามเอกสารประกอบ: FROM (Transact-SQL) :

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

คำสำคัญOUTERถูกทำเครื่องหมายเป็นตัวเลือก (อยู่ในวงเล็บเหลี่ยม) ในกรณีเฉพาะนี้ไม่ว่าคุณจะระบุOUTERหรือไม่สร้างความแตกต่าง โปรดทราบว่าในขณะที่องค์ประกอบอื่น ๆ ของการเข้าร่วมข้อยังถูกทำเครื่องหมายเป็นตัวเลือกออกจากพวกเขาออกมาจะสร้างความแตกต่าง

ยกตัวอย่างเช่นประเภทส่วนทั้งหมดของJOINประโยคเป็นตัวเลือกในกรณีที่เริ่มต้นคือถ้าคุณเพียงแค่ระบุINNER JOINกล่าวอีกนัยหนึ่งสิ่งนี้ถูกกฎหมาย:

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

นี่คือรายการของไวยากรณ์ที่เทียบเท่า:

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

ดูที่คำตอบที่ฉันทิ้งไว้กับคำถาม SO อื่น ๆ : SQL เข้าร่วม vs vs หลาย ๆ ตารางบนบรรทัดจาก? .

ป้อนคำอธิบายรูปภาพที่นี่


135
ถูกต้องอย่างแน่นอน OUTER อนุญาตให้ใช้งานร่วมกับ ANSI-92 ได้
ฌอน Reilly

11
@ LasseV.Karlsen มันจะดีกว่าไหมถ้ามีINNER JOINทางขวาและJOINทางซ้ายในรายการเทียบเท่า?
nawfal

8
@ LasseV.Karlsen ฉันแค่หมายถึงว่าด้านซ้ายมีรูปแบบที่กระชับและด้านขวามีรูปแบบขยาย ฉันคิดว่ามันจะทำให้มันเชื่อมโยงกันถ้าคุณทำตามเหมือนกันสำหรับJOINs เช่นกัน
nawfal

30
@Outlier นั่นคือสิทธิพิเศษของคุณ แต่คนอื่น ๆ อีก 451 คนคิดว่าคำตอบนั้นดี ความซื่อสัตย์ถ้าคำตอบเดียวบอกว่า X และอีกคำตอบบอกว่า X และอ้างอิงเอกสารรวมทั้งคัดลอกเอกสารที่เกี่ยวข้องในคำตอบการโหวตของฉันไปที่คำตอบที่สองและนั่นคือเหตุผลที่ฉันเขียนคำตอบในแบบที่ถูกต้อง ฉันทำ. มีคนอ้างว่า X ไม่ดี หากคุณสามารถพิสูจน์ X ได้ดีกว่า (ไม่ใช่คำตอบของ sactiw เล็กน้อย) แต่มันเป็นสิทธิพิเศษของคุณที่จะคิดในสิ่งที่คุณต้องการ ฉันถามว่าทำไมคุณถึงคิดว่ามันไม่มีประโยชน์ แต่คำตอบนั้นผิดหรือเปล่า?
Lasse V. Karlsen

7
@Outlier และบอกตามตรงถ้าคุณไม่อยากอ่านคำตอบ "ยาว" ของฉันคำตอบของฉันก็ไม่เหมาะกับคุณ มันมีไว้สำหรับทุกคนที่มาที่นี่ด้วยความสงสัยเกี่ยวกับสิ่งเดียวกันและต้องการพื้นหลังเกี่ยวกับสาเหตุที่เป็นและสถานที่ที่จะหาข้อมูลเพิ่มเติม ฯลฯ เห็นได้ชัดว่าคุณเป็นคนประเภทที่ต้องการคำตอบนี้: "ไม่มี" แต่น่าเสียดายที่ ไม่ใช่คำตอบทางกฎหมายที่นี่ใน Stack Overflow และไม่ควรเป็นเช่นนั้น
Lasse V. Karlsen

700

เพื่อตอบคำถามของคุณไม่มีความแตกต่างระหว่าง LEFT JOIN และ LEFT OUTER OOTER พวกเขาเหมือนกันที่กล่าวว่า

ที่ระดับบนสุดมีการรวม 3 แบบ:

  1. INNER
  2. OUTER
  3. ข้าม

  1. เข้าร่วมภายใน - ดึงข้อมูลหากมีอยู่ในตารางทั้งสอง

  2. OUTER JOINมี3ประเภท:

    1. LEFT OUTER JOIN - ดึงข้อมูลหากมีอยู่ในตารางด้านซ้าย
    2. RIGHT OUTER JOIN - ดึงข้อมูลถ้ามีอยู่ในตารางด้านขวา
    3. FULL OUTER JOIN - ดึงข้อมูลถ้ามีอยู่ในตารางใดตารางหนึ่ง
  3. CROSS JOINตามชื่อที่แนะนำนั้นจะ[n X m]รวมทุกอย่างเข้ากับทุกสิ่ง
    คล้ายกับสถานการณ์ที่เราแสดงรายการตารางสำหรับการเข้าร่วม (ในส่วนFROMคำSELECTสั่ง) โดยใช้เครื่องหมายจุลภาคเพื่อแยกพวกเขา


คะแนนที่ควรสังเกต:

  • หากคุณเพียงแค่พูดถึงแล้วโดยเริ่มต้นจะเป็นJOININNER JOIN
  • การOUTERเข้าร่วมจะต้องเป็นLEFT| RIGHT| คุณไม่สามารถเพียงแค่พูดFULLOUTER JOIN
  • คุณสามารถวางOUTERหลักและเพียงแค่พูดLEFT JOINหรือหรือRIGHT JOINFULL JOIN

สำหรับผู้ที่ต้องการเห็นภาพเหล่านี้ในวิธีที่ดีกว่าโปรดไปที่ลิงค์นี้: คำอธิบายภาพของ SQL Joins


17
คำตอบที่ดีมาก จะชัดเจนขึ้นถ้าคุณพูดว่า "ซ้ายเข้าร่วม - ดึงข้อมูลทั้งหมดจากตารางด้านซ้ายด้วยข้อมูลที่ตรงกันจากด้านขวาถ้าตั้งไว้ล่วงหน้า" สำหรับ 2.1 (และการเปลี่ยนแปลงที่คล้ายกันสำหรับ 2.2)
ssh

1
นอกจากนี้คุณสามารถเข้าร่วมไขว้โดย 'เลือก * จาก TableA, TableB'
om471987

3
ขออภัยถ้าฉันไม่สนใจ แต่เป็นCROSS JOINเหมือนกันFULL JOINหรือไม่
TechnicalTophat

9
@RhysO ไม่ CROSS JOIN เป็นผลิตภัณฑ์คาร์ทีเซียนเช่น CROSS JOIN ของตารางมี n แถวกับตารางมีแถว m จะให้แถว (n * m) เสมอในขณะที่เต็มนอกเข้าร่วมของตารางมี n แถว ด้วยโต๊ะที่มีแถว m จะให้ที่สูงสุด (n + m) แถว
sactiw

1
@sactiw พิจารณาที่จะเพิ่มบันทึกพิเศษในคำตอบที่มีค่าของคุณเกี่ยวกับความแตกต่างระหว่างCross JoinและFull Outer Join... ในบางวิธีที่คล้ายกัน
Manuel Jordan

356

การเข้าร่วมด้านซ้ายและการเข้าร่วมด้านนอกด้านซ้ายแตกต่างกันอย่างไร

ไม่มีอะไร LEFT JOINและLEFT OUTER JOINเทียบเท่า


13
อืมสวัสดี! ใครโหวตสิ่งนี้? LEFT JOIN เหมือนกับ LEFT OUTER JOIN
Mitch Wheat ตั้งแต่

7
นี่เป็นกรณีใน Microsoft SQL Server และ RDBMS ที่สอดคล้องกับ SQL อื่น ๆ
Bill Karwin

7
มันจะดีถ้าคุณเพิ่มการอ้างอิงหรือคำอธิบายเกี่ยวกับสาเหตุที่OUTERเป็นตัวเลือก
Zero3

7
คำตอบที่กระชับและแม่นยำที่สุดที่นี่
Manachi

4
ขอบคุณ. คำตอบที่ยอมรับมีข้อมูลมากเกินไปจนทำให้ฉันสับสนมากขึ้น ตรงนี้เป็นสิ่งที่ฉันต้องการรู้และตอบคำถามต้นฉบับตรงประเด็น
เบคอนแบรด

66

ฉันเป็น PostgreSQL DBA ตราบใดที่ฉันสามารถเข้าใจความแตกต่างระหว่างด้านนอกหรือด้านนอกเข้าร่วมความแตกต่างเป็นหัวข้อที่มีการอภิปรายมากทั่วอินเทอร์เน็ต จนกระทั่งวันนี้ฉันไม่เคยเห็นความแตกต่างระหว่างสองคนนี้ ดังนั้นฉันจึงไปต่อและพยายามค้นหาความแตกต่างระหว่างสิ่งนั้น ในตอนท้ายฉันอ่านเอกสารทั้งหมดเกี่ยวกับเรื่องนี้และฉันพบคำตอบสำหรับสิ่งนี้

ดังนั้นหากคุณดูเอกสาร (อย่างน้อยใน PostgreSQL) คุณสามารถค้นหาวลีนี้:

"คำพูดINNERและOUTERเป็นตัวเลือกในทุกรูปแบบ. INNERเป็นค่าเริ่มต้นLEFT, RIGHTและFULLบ่งบอกถึงการเข้าร่วม outer."

อีกนัยหนึ่งคือ

LEFT JOINและLEFT OUTER JOINเป็นเช่นเดียวกัน

RIGHT JOINและRIGHT OUTER JOINเป็นเช่นเดียวกัน

ฉันหวังว่ามันจะเป็นประโยชน์สำหรับผู้ที่ยังคงพยายามค้นหาคำตอบ


60

Left JoinและLeft Outer Joinเป็นหนึ่งและเดียวกัน อดีตคือชวเลขสำหรับหลัง เดียวกันสามารถพูดเกี่ยวกับRight JoinและRight Outer Joinความสัมพันธ์ การสาธิตจะแสดงให้เห็นถึงความเท่าเทียมกัน ตัวอย่างการใช้งานของแต่ละแบบสอบถามได้รับการให้บริการผ่านทางSQL ซอ เครื่องมือนี้จะช่วยให้มือในการจัดการของแบบสอบถาม

ป.ร. ให้ไว้

ป้อนคำอธิบายรูปภาพที่นี่

ซ้ายเข้าร่วมและซ้ายนอกเข้าร่วม

ป้อนคำอธิบายรูปภาพที่นี่

ผล

ป้อนคำอธิบายรูปภาพที่นี่


เข้าร่วมขวาและเข้าร่วมด้านนอกขวา

ป้อนคำอธิบายรูปภาพที่นี่

ผล

ป้อนคำอธิบายรูปภาพที่นี่


43

ฉันคิดว่าการคิดถึง Joins ง่ายขึ้นในลำดับต่อไปนี้:

  • CROSS JOIN - ผลิตภัณฑ์คาร์ทีเซียนของทั้งสองตาราง เข้าร่วมทั้งหมดเริ่มต้นที่นี่
  • เข้าร่วมภายใน - CROSS JOIN พร้อมกับเพิ่มตัวกรอง
  • เข้าร่วมภายนอก - เข้าร่วมภายในที่มีองค์ประกอบที่ขาดหายไป (จากซ้ายหรือตารางขวา) เพิ่มหลังจากนั้น

จนกว่าฉันจะหาแบบจำลองที่เรียบง่ายนี้ (ค่อนข้าง) เข้าร่วมเป็นศิลปะสีดำเล็กน้อย ตอนนี้พวกเขามีเหตุผลสมบูรณ์แบบ

หวังว่าสิ่งนี้จะช่วยได้มากกว่าความสับสน


นี่ไม่ได้ตอบคำถาม
philipxy

33

ทำไมซ้าย / ขวาและซ้ายซ้าย / ขวาเหมือนกัน มาอธิบายเหตุผลที่คำศัพท์นี้กันดีกว่า ทำความเข้าใจว่าการรวมซ้ายและขวาเป็นกรณีเฉพาะของการเข้าร่วม OUTER และดังนั้นจึงไม่สามารถเป็นอย่างอื่นได้นอกจากสิทธิซ้าย / ขวาของเรา การเข้าร่วมของ OUTER เรียกว่าFULL OUTER ซึ่งต่างจากการรวมซ้ายและขวาที่เป็นผลลัพธ์บางส่วนของการเข้าร่วม OUTER อันที่จริง:

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)

เป็นที่ชัดเจนแล้วว่าทำไมการดำเนินการเหล่านั้นจึงมีนามแฝงรวมถึงมีเพียง 3 กรณีเท่านั้น: INNER, OUTER, CROSS มีสองกรณีย่อยสำหรับ OUTER คำศัพท์วิธีที่ครูอธิบายสิ่งนี้รวมถึงคำตอบบางอย่างข้างต้นมักทำให้ดูเหมือนว่ามีการเข้าร่วมหลายประเภท แต่จริงๆแล้วมันง่ายมาก


1
"ชัดเจนเพียง 3 รายเท่านั้น": น่าสนใจ แต่มีข้อบกพร่อง พิจารณาว่าการรวมภายในเป็นการรวมข้ามแบบพิเศษ (เช่นย้ายการเข้าร่วมเพรดิเคตไปที่ข้อ) พิจารณาเพิ่มเติมว่าการเข้าร่วมภายนอกไม่ใช่การเข้าร่วมเลย แต่เป็นการรวมที่ใช้ค่า null แทนคอลัมน์ 'หายไป' ดังนั้นจึงอาจเป็นที่ถกเถียงกันอยู่ว่ากากบาทเป็นการเข้าร่วมเพียงอย่างเดียวที่จำเป็น หมายเหตุการคิดในปัจจุบันในทฤษฎีเชิงสัมพันธ์คือการเข้าร่วมตามธรรมชาติเป็นไปตามข้อกำหนดการเข้าร่วมทั้งหมด นอกเหนือจาก: คุณสามารถอธิบายได้ว่าคำศัพท์ " JOINหมายถึงINNER JOIN" เหมาะสมกับเหตุผลของคุณในการเข้าร่วมคำศัพท์ภายนอกได้อย่างไร?
oneday เมื่อ

27

เพื่อตอบคำถามของคุณ

ใน SQL Server รวมไวยากรณ์OUTERเป็นตัวเลือก

มีการกล่าวถึงในบทความ msdn: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

ดังนั้นรายการต่อไปนี้จะแสดงการเข้าร่วมไวยากรณ์ที่เทียบเท่าโดยมีและไม่มีOUTER

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

ไวยากรณ์ที่เทียบเท่าอื่น ๆ

INNER JOIN => JOIN
CROSS JOIN => ,

ขอแนะนำ Dotnet Mob Artice: เข้าร่วมใน SQL Server ป้อนคำอธิบายรูปภาพที่นี่


2
การดูแผนภาพ Venn อีกครั้งที่นี่ดูความคิดเห็นของฉันในคำถาม
philipxy

20

มี 3 การเข้าร่วม:

  • A) Cross เข้าร่วม = คาร์ทีเซียน (เช่น: ตาราง A, ตาราง B)
  • B) Inner Join = JOIN (เช่น: ตาราง A Join / Inner Join Table B)
  • C) ด้านนอกเข้าร่วม:

       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    

หวังว่ามันจะช่วย


1
ดังนั้น 5 รวมเข้าด้วยกัน
Zeek2

19

ส่วนใหญ่มีสามประเภทเข้าร่วม

  1. Inner: ดึงข้อมูลที่มีอยู่ในตารางทั้งสอง
    • เฉพาะเข้าร่วมหมายถึงเข้าร่วมภายใน
  2. ด้านนอก: มีสามประเภท

    • LEFT OUTER - - ดึงข้อมูลที่มีอยู่ในตารางด้านซ้ายและเงื่อนไขการจับคู่เท่านั้น
    • RIGHT OUTER - - ดึงข้อมูลที่มีอยู่ในตารางและเงื่อนไขการจับคู่ที่ถูกต้องเท่านั้น
    • FULL OUTER - - ดึงข้อมูลนำเสนอตารางใดก็ได้หรือทั้งสองอย่าง
    • (ซ้ายหรือขวาหรือเต็ม) OUTER JOIN สามารถเขียนได้โดยไม่ต้องเขียน "OUTER"
  3. ข้ามเข้าร่วม: รวมทุกอย่างเข้ากับทุกอย่าง


16

น้ำตาลซินแทคติกทำให้ผู้อ่านทั่วไปเห็นได้ชัดว่าการเข้าร่วมไม่ใช่น้ำตาลใน


2
ดังนั้น ... เข้าร่วมเต็มที่แล้วคืออะไร?
Amy B

5
TableA FULL OUTER JOIN tableB จะให้คุณมีสามประเภทของการบันทึก: ระเบียนทั้งหมดใน tableA ที่ไม่มีระเบียนที่ตรงกันใน tableB, ระเบียนทั้งหมดใน tableB ที่ไม่มีระเบียนที่ตรงกันใน tableA และระเบียนทั้งหมดใน tableA ที่มีระเบียนที่ตรงกันใน tableB
Dave DuPlantis

4

ในบริบทของคำถามนี้ฉันต้องการโพสต์ตัวดำเนินการ 2 'ใช้' เช่นกัน:

เข้าร่วม :

  1. เข้าร่วมภายใน = เข้าร่วม

  2. เข้าร่วมด้านนอก

    • ซ้ายเข้าร่วม = ซ้ายเข้าร่วม

    • เข้าร่วมด้านนอก = เข้าร่วมถูกต้อง

    • เข้าร่วมเต็มรูปแบบ = เข้าร่วมเต็มรูปแบบ

  3. ข้ามเข้าร่วม

SELF-JOIN : นี่ไม่ใช่การเข้าร่วมประเภทที่แยกต่างหาก นี่คือการเข้าร่วมตารางโดยใช้การรวมข้างต้นอย่างใดอย่างหนึ่ง แต่ฉันรู้สึกว่ามันคุ้มค่าที่จะกล่าวถึงในการสนทนา JOIN เนื่องจากคุณจะได้ยินคำศัพท์นี้จากหลาย ๆ คนในชุมชนนักพัฒนา SQL

ใช้ :

  1. CROSS ใช้ - คล้ายกับ INNER JOIN (แต่ได้เพิ่มความได้เปรียบในการคำนวณบางอย่างในตาราง Right สำหรับแต่ละแถวของตารางด้านซ้ายและจะคืนเฉพาะแถวที่ตรงกัน)
  2. ใช้ภายนอก - คล้ายกับซ้ายเข้าร่วมนอก (แต่ได้เพิ่มความได้เปรียบในการคำนวณบางอย่างในตาราง Right สำหรับแต่ละแถวของตารางด้านซ้ายและจะคืนแถวทั้งหมดจากตารางด้านซ้ายโดยไม่คำนึงถึงการจับคู่บนตารางด้านขวา)

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

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

ตัวอย่างชีวิตจริงเมื่อใช้ OUTER / CROSS ใช้ใน SQL

ฉันพบว่าตัวดำเนินการประยุกต์ใช้นั้นมีประโยชน์มากเพราะให้ประสิทธิภาพที่ดีกว่าไม่ต้องทำการคำนวณแบบเดียวกันในแบบสอบถามย่อย นอกจากนี้ยังเป็นการแทนที่ฟังก์ชันการวิเคราะห์จำนวนมากใน SQL Server เวอร์ชันเก่า นั่นคือเหตุผลที่ฉันเชื่อว่าหลังจากคุ้นเคยกับ JOINS แล้วผู้พัฒนา SQL หนึ่งคนควรพยายามเรียนรู้ผู้ดำเนินการต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.