อะไรคือความแตกต่างระหว่าง CROSS JOIN และ FULL OUTER JOIN ใน SQL Server
พวกเขาเหมือนกันหรือไม่? กรุณาอธิบาย. เมื่อใดจะใช้อย่างใดอย่างหนึ่งเหล่านี้
อะไรคือความแตกต่างระหว่าง CROSS JOIN และ FULL OUTER JOIN ใน SQL Server
พวกเขาเหมือนกันหรือไม่? กรุณาอธิบาย. เมื่อใดจะใช้อย่างใดอย่างหนึ่งเหล่านี้
คำตอบ:
การเข้าร่วมไขว้สร้างผลิตภัณฑ์คาร์ทีเซียนระหว่างสองตารางเพื่อคืนค่าการรวมกันที่เป็นไปได้ทั้งหมดของแถวทั้งหมด มันไม่มีon
ข้อเพราะคุณเพียงแค่เข้าร่วมทุกอย่างกับทุกสิ่ง
A full outer join
เป็นการรวมกันของ a left outer
และright outer
เข้าร่วม มันจะส่งคืนแถวทั้งหมดในทั้งสองตารางที่ตรงกับส่วนคำwhere
สั่งของแบบสอบถามและในกรณีที่on
เงื่อนไขไม่สามารถใช้ได้กับแถวเหล่านั้นจะทำให้null
ค่าในเขตข้อมูลที่ไม่มีผู้อยู่อาศัย
นี้วิกิพีเดียบทความอธิบายถึงชนิดต่างๆของร่วมกับตัวอย่างของการส่งออกได้รับชุดตัวอย่างของตาราง
outer join
เร็วขึ้นหรือcross join
?
สิ่งหนึ่งที่อาจไม่ชัดเจนสำหรับบางคนก็คือการที่ cross cross เข้าร่วมกับตารางที่ว่างเปล่า (หรือชุดผลลัพธ์) ส่งผลให้มีตารางว่าง (M x N; ดังนั้น M x 0 = 0)
การรวมภายนอกเต็มรูปแบบจะมีแถวยกเว้นว่าทั้ง M และ N เป็น 0
ฉันต้องการเพิ่มประเด็นสำคัญหนึ่งข้อสำหรับคำตอบอื่น ๆ ซึ่งจริงๆแล้วฉันได้อธิบายหัวข้อนี้ในวิธีที่ดีที่สุด:
หากตารางที่เข้าร่วม 2 ตารางมีแถว M และ N ดังนั้นการรวมข้ามจะสร้างแถว (M x N) เสมอ แต่การรวมภายนอกเต็มรูปแบบจะสร้างจากแถว MAX (M, N) ถึง (M + N) แถว (ขึ้นอยู่กับจำนวนแถวจริง ๆ จับคู่ "กับ" เพรดิเคต)
แก้ไข:
จากมุมมองของการประมวลผลการสืบค้นแบบโลจิคัล CROSS JOIN จะสร้างแถว M x N เสมอ สิ่งที่เกิดขึ้นกับ FULL OUTER JOIN คือตารางทั้งด้านซ้ายและด้านขวานั้น "เก็บรักษาไว้" ราวกับว่าทั้งซ้ายและขวาเกิดขึ้น ดังนั้นแถวที่ไม่พอใจกับเพรดิเคตจากตารางทั้งซ้ายและขวาจะถูกเพิ่มเข้าไปในชุดผลลัพธ์
cross join
ตารางทวีคูณ; full outer join
เพิ่มพวกเขาในกรณีที่เลวร้ายที่สุดขึ้นอยู่กับจำนวนแถวตรง ..
Cross join: Cross Joins ให้ผลลัพธ์ที่ประกอบด้วยทุกชุดของแถวจากสองตารางขึ้นไป นั่นหมายความว่าถ้าตาราง A มี 3 แถวและตาราง B มี 2 แถว CROSS JOIN จะส่งผลให้มี 6 แถว ไม่มีการสร้างความสัมพันธ์ระหว่างสองตาราง - คุณแค่สร้างชุดค่าผสมที่เป็นไปได้ทั้งหมด
การเข้าร่วมด้านนอกเต็มรูปแบบ: การเข้าร่วมเต็มด้านนอกไม่ใช่ "ซ้าย" หรือ "ถูก" - ทั้งคู่! มันรวมแถวทั้งหมดจากทั้งสองตารางหรือชุดผลลัพธ์ที่เข้าร่วมในการเข้าร่วม เมื่อไม่มีแถวที่ตรงกันสำหรับแถวที่ด้าน "ซ้าย" ของ JOIN คุณจะเห็นค่า Null จากชุดผลลัพธ์บน "ขวา" ในทางกลับกันเมื่อไม่มีแถวที่ตรงกันสำหรับแถวที่ด้าน "ขวา" ของ JOIN คุณจะเห็นค่า Null จากชุดผลลัพธ์ที่ "ซ้าย"
สำหรับ 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
)
พวกมันเป็นแนวคิดเดียวกันนอกเหนือจากค่า 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
*/
ข้ามเข้าร่วม : 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)
การเข้าร่วมด้านนอกเต็มรูปแบบเป็นการรวมการเข้าร่วมด้านนอกด้านซ้ายและการเข้าร่วมด้านนอกด้านขวา ชุดผลลัพธ์จะส่งคืนแถวจากทั้งสองตารางที่ตรงตามเงื่อนไข แต่จะส่งคืนคอลัมน์ null ที่ไม่มีการจับคู่
การเข้าร่วมไขว้เป็นผลิตภัณฑ์คาร์ทีเซียนที่ไม่ต้องการเงื่อนไขใด ๆ ในการเข้าร่วมตาราง ชุดผลลัพธ์ประกอบด้วยแถวและคอลัมน์ที่เป็นการคูณของทั้งสองตาราง
นี่คือตัวอย่างที่ทั้ง 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 แถว) ที่ได้รับผลกระทบ
SQL FULL OUTER OOTER
FULL OUTER JOIN ส่งคืนแถวทั้งหมดจากตารางด้านซ้าย (ตารางที่ 1) และจากตารางด้านขวา (ตารางที่ 2) โดยไม่คำนึงถึงการแข่งขัน
คำหลัก FULL OUTER 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/
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
จะเร็วกว่าเสมอFROM t1,t2 WHERE t1.id=t2.id
?