SQL Server: CROSS JOIN และ FULL OUTER JOIN แตกต่างกันอย่างไร


194

อะไรคือความแตกต่างระหว่าง CROSS JOIN และ FULL OUTER JOIN ใน SQL Server

พวกเขาเหมือนกันหรือไม่? กรุณาอธิบาย. เมื่อใดจะใช้อย่างใดอย่างหนึ่งเหล่านี้

คำตอบ:


243

การเข้าร่วมไขว้สร้างผลิตภัณฑ์คาร์ทีเซียนระหว่างสองตารางเพื่อคืนค่าการรวมกันที่เป็นไปได้ทั้งหมดของแถวทั้งหมด มันไม่มีonข้อเพราะคุณเพียงแค่เข้าร่วมทุกอย่างกับทุกสิ่ง

A full outer joinเป็นการรวมกันของ a left outerและright outerเข้าร่วม มันจะส่งคืนแถวทั้งหมดในทั้งสองตารางที่ตรงกับส่วนคำwhereสั่งของแบบสอบถามและในกรณีที่onเงื่อนไขไม่สามารถใช้ได้กับแถวเหล่านั้นจะทำให้nullค่าในเขตข้อมูลที่ไม่มีผู้อยู่อาศัย

นี้วิกิพีเดียบทความอธิบายถึงชนิดต่างๆของร่วมกับตัวอย่างของการส่งออกได้รับชุดตัวอย่างของตาราง


แล้วในกรณีที่โต๊ะใหญ่ FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id จะเร็วกว่าเสมอ FROM t1,t2 WHERE t1.id=t2.id?
alexkovelsky

@alexkovelsky การรวมภายในมักเร็วขึ้นเมื่อมีการจับคู่ระหว่างสองตารางน้อยเนื่องจากการใช้ดัชนีหมายความว่าไม่ต้องอ่านแถวทั้งหมดในตารางใดตารางหนึ่ง การรวมภายนอกเต็มรูปแบบจะต้องอ่านแถวทั้งหมดในตารางทั้งสอง (หรือดัชนีที่เกี่ยวข้อง) เสมอ ในกรณีที่ดัชนีไม่เพียงพอหรือต้องอ่าน heap ที่จำเป็นเพื่อส่งออกคอลัมน์ที่ต้องการดังนั้นการรวมภายนอกทั้งหมดจะช้ากว่าการรวมภายใน
Andrew Hill

1
คือouter joinเร็วขึ้นหรือcross join?
Shafizadeh

2
@Shafizadeh - พวกเขาทำสิ่งต่าง ๆ
Donnie

9
จะเกิดอะไรขึ้นถ้าฉันเต็มจำนวนเข้าร่วมกับ True ผลลัพธ์ / ประสิทธิภาพจะคล้ายกับ CROSS JOIN
Architectonic

65

สิ่งหนึ่งที่อาจไม่ชัดเจนสำหรับบางคนก็คือการที่ cross cross เข้าร่วมกับตารางที่ว่างเปล่า (หรือชุดผลลัพธ์) ส่งผลให้มีตารางว่าง (M x N; ดังนั้น M x 0 = 0)

การรวมภายนอกเต็มรูปแบบจะมีแถวยกเว้นว่าทั้ง M และ N เป็น 0


32

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

หากตารางที่เข้าร่วม 2 ตารางมีแถว M และ N ดังนั้นการรวมข้ามจะสร้างแถว (M x N) เสมอ แต่การรวมภายนอกเต็มรูปแบบจะสร้างจากแถว MAX (M, N) ถึง (M + N) แถว (ขึ้นอยู่กับจำนวนแถวจริง ๆ จับคู่ "กับ" เพรดิเคต)

แก้ไข:

จากมุมมองของการประมวลผลการสืบค้นแบบโลจิคัล CROSS JOIN จะสร้างแถว M x N เสมอ สิ่งที่เกิดขึ้นกับ FULL OUTER JOIN คือตารางทั้งด้านซ้ายและด้านขวานั้น "เก็บรักษาไว้" ราวกับว่าทั้งซ้ายและขวาเกิดขึ้น ดังนั้นแถวที่ไม่พอใจกับเพรดิเคตจากตารางทั้งซ้ายและขวาจะถูกเพิ่มเข้าไปในชุดผลลัพธ์


2
ขอบเขตเหล่านั้นไม่รวมการแข่งขัน 1 จำนวนมากที่เป็นไปได้หรือไม่ การรวมภายนอกเต็มรูปแบบยังคงสามารถสร้างแถว (M x N) ได้
maxwellb

1
เลือก COUNT_BIG (*) จากการจราจร t รับ CROSS เข้าร่วมผู้รับ r และเลือก COUNT_BIG (*) จากการจราจร t เข้าร่วมเต็มผู้รับ r (1 = 1) พวกเขาเหมือนกัน
urlreader

2
ของคุณคือคำตอบที่ดีที่สุด พื้น: cross joinตารางทวีคูณ; full outer joinเพิ่มพวกเขาในกรณีที่เลวร้ายที่สุดขึ้นอยู่กับจำนวนแถวตรง ..
ไบรอันปีเตอร์สัน

ใช่ .. ฉันกำลังมองหาคณิตศาสตร์นี้ - ผลิตจากแถว MAX (M, N) ถึง (M + N) .. ขอบคุณที่โหวตขึ้น
Arup Rakshit

1
นี่เป็นสิ่งที่ผิด FULL JOIN ON row คือ INNER JOIN ON Row แถว UNION ทั้งหมดที่ไม่มีใครเทียบได้ ดังนั้นการเข้าร่วมเต็มรูปแบบสามารถส่งคืนแถว M * N - อาจมากกว่า MAX (M, N) & M + N แต่อย่างไรก็ตามนาทีและจำนวนสูงสุดของแถวกลับเป็นหน้าที่ของ M & เอ็นเป็นเพียงไม่เป็นประโยชน์ สิ่งที่มีประโยชน์คือคำจำกัดความที่ชัดเจนของการเข้าร่วมเต็มรูปแบบ - ในแง่ของการเข้าร่วมภายในและแถวที่ไม่ตรงกัน
philipxy

15

Cross join: Cross Joins ให้ผลลัพธ์ที่ประกอบด้วยทุกชุดของแถวจากสองตารางขึ้นไป นั่นหมายความว่าถ้าตาราง A มี 3 แถวและตาราง B มี 2 แถว CROSS JOIN จะส่งผลให้มี 6 แถว ไม่มีการสร้างความสัมพันธ์ระหว่างสองตาราง - คุณแค่สร้างชุดค่าผสมที่เป็นไปได้ทั้งหมด

การเข้าร่วมด้านนอกเต็มรูปแบบ: การเข้าร่วมเต็มด้านนอกไม่ใช่ "ซ้าย" หรือ "ถูก" - ทั้งคู่! มันรวมแถวทั้งหมดจากทั้งสองตารางหรือชุดผลลัพธ์ที่เข้าร่วมในการเข้าร่วม เมื่อไม่มีแถวที่ตรงกันสำหรับแถวที่ด้าน "ซ้าย" ของ JOIN คุณจะเห็นค่า Null จากชุดผลลัพธ์บน "ขวา" ในทางกลับกันเมื่อไม่มีแถวที่ตรงกันสำหรับแถวที่ด้าน "ขวา" ของ JOIN คุณจะเห็นค่า Null จากชุดผลลัพธ์ที่ "ซ้าย"


15

สำหรับ SQL Server CROSS JOIN and FULL OUTER JOINนั้นแตกต่างกัน CROSS JOINเป็นเพียงผลิตภัณฑ์คาร์ทีเซียนของสองตารางโดยไม่คำนึงถึงเกณฑ์การกรองหรือเงื่อนไขใด ๆ

FULL OUTER JOINให้ชุดผลลัพธ์ที่ไม่ซ้ำกันLEFT OUTER JOIN and RIGHT OUTER JOINของสองตาราง มันต้องการ ON อนุประโยคในการแมปสองคอลัมน์ของตาราง

ตารางที่ 1 มี 10 แถวและตารางที่ 2 มี 20 แถวพร้อม 5 แถวที่ตรงกันในคอลัมน์ที่ระบุ

จากนั้นCROSS JOINจะส่งคืน 10 * 20 = 200 แถวในชุดผลลัพธ์

FULL OUTER JOIN จะส่งคืน 25 แถวในชุดผลลัพธ์

FULL OUTER JOIN(หรือ JOIN อื่น ๆ ) จะส่งคืนชุดผลลัพธ์ที่น้อยกว่าหรือเท่ากับCartesian Product numberเสมอ

จำนวนแถวที่ส่งคืนโดยFULL OUTER JOINเท่ากับ (จำนวนของแถวLEFT OUTER JOIN) + (จำนวนแถวโดยRIGHT OUTER JOIN) - (จำนวนแถวโดยINNER JOIN)


8

พวกมันเป็นแนวคิดเดียวกันนอกเหนือจากค่า NULL ที่ส่งคืน

ดูด้านล่าง:

declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;

declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;

select
    t1.*,
    t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;

/* full outer join
col1        col2        col1        col2
----------- ----------- ----------- -----------
NULL        NULL        10          101
1           11          NULL        NULL
2           22          2           202
*/

select
    t1.*,
    t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;

/* cross join
col1        col2        col1        col2
----------- ----------- ----------- -----------
1           11          2           202
1           11          10          101
2           22          2           202
2           22          10          101
*/

1
ตัวอย่างที่ยอดเยี่ยม!
Lucas925

1
ขอบคุณสำหรับตัวอย่างข้อมูลจริง ทำให้ชัดเจนขึ้น
dtc

5

ข้ามเข้าร่วม : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm

TLDR; สร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดระหว่าง 2 ตาราง (ผลิตภัณฑ์ Carthesian)

(เต็ม) การรวมภายนอก : http://www.w3schools.com/Sql/sql_join_full.asp

TLDR; ส่งคืนทุกแถวในตารางทั้งสองและผลลัพธ์ที่มีค่าเหมือนกัน (ตรงกันใน CONDITION)


2

การเข้าร่วมด้านนอกเต็มรูปแบบเป็นการรวมการเข้าร่วมด้านนอกด้านซ้ายและการเข้าร่วมด้านนอกด้านขวา ชุดผลลัพธ์จะส่งคืนแถวจากทั้งสองตารางที่ตรงตามเงื่อนไข แต่จะส่งคืนคอลัมน์ null ที่ไม่มีการจับคู่

การเข้าร่วมไขว้เป็นผลิตภัณฑ์คาร์ทีเซียนที่ไม่ต้องการเงื่อนไขใด ๆ ในการเข้าร่วมตาราง ชุดผลลัพธ์ประกอบด้วยแถวและคอลัมน์ที่เป็นการคูณของทั้งสองตาราง


1

นี่คือตัวอย่างที่ทั้ง FULL OUTER JOIN และ CROSS JOIN ส่งคืนชุดผลลัพธ์เดียวกันโดยที่ NULL คืนค่า โปรดทราบ 1 = 1 ในส่วนคำสั่ง ON สำหรับการเข้าร่วมเต็มรูปแบบนอก:

declare @table1 table (     col1    int,    col2    int ) 
declare @table2 table (     col1    int,    col2    int )

insert into @table1 select  1, 11   union all select    2, 22   

insert into @table2 select  10, 101 union all select     2, 202

select  *
from    @table1 t1 full outer join @table2 t2
    on  1 = 1
(2 แถวได้รับผลกระทบ)

(2 แถวได้รับผลกระทบ)
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10 101
1 11 2 202
2 22 2 202
select  *
from    @table1 t1 cross join @table2 t2
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10 101
1 11 2 202
2 22 2 202

(4 แถว) ที่ได้รับผลกระทบ

1

SQL FULL OUTER OOTER

  • FULL OUTER JOIN ส่งคืนแถวทั้งหมดจากตารางด้านซ้าย (ตารางที่ 1) และจากตารางด้านขวา (ตารางที่ 2) โดยไม่คำนึงถึงการแข่งขัน

  • คำหลัก FULL OUTER JOIN รวมผลลัพธ์ของทั้งซ้ายและขวาเข้าร่วม

  • การรวมภายนอกเต็มของ SQL เรียกอีกอย่างว่า FULL JOIN

การอ้างอิง: http://datasciencemadesimple.com/sql-full-outer-join/

เข้าร่วม CROSS SQL

  • ใน SQL CROSS JOIN แต่ละแถวของตารางแรกจะถูกแมปกับแถวแต่ละแถวของตารางที่สอง

  • จำนวนแถวที่สร้างโดยชุดผลลัพธ์ของการดำเนินการ CROSS JOIN เท่ากับจำนวนแถวในตารางแรกคูณด้วยจำนวนแถวในตารางที่สอง

  • CROSS JOIN ยังเป็นที่รู้จักกันในนามผลิตภัณฑ์คาร์ทีเซียน / คาร์ทีเซียนเข้าร่วม

  • จำนวนแถวในตาราง A คือ m จำนวนแถวในตาราง B คือ n และตารางผลลัพธ์จะมีแถว m * n

การอ้างอิง: http://datasciencemadesimple.com/sql-cross-join/

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