CROSS JOIN = (ภายใน) JOIN = เครื่องหมายจุลภาค (",")
TL; DRความแตกต่างเพียงอย่างเดียวระหว่าง SQL CROSS JOIN, (INNER) JOIN และจุลภาค (",") (นอกเหนือจากเครื่องหมายจุลภาคที่มีลำดับความสำคัญต่ำกว่าสำหรับลำดับการประเมินผล) คือ (INNER) JOIN มี ON ในขณะ CROSS JOIN และเครื่องหมายจุลภาค
Re ผลิตภัณฑ์ระดับกลาง
ทั้งสามผลิตผลิตภัณฑ์ "คาร์ทีเซียน" แนวคิดเชิงสัมพันธ์ระดับกลางหรือที่รู้จักกันในชื่อ cross cross ซึ่งเป็นการรวมกันของแถวที่เป็นไปได้ทั้งหมดจากแต่ละตาราง มันเปิดและ / หรือตำแหน่งที่ลดจำนวนแถว ซอ Fiddle
มาตรฐาน SQL กำหนด <comma> ผ่านผลิตภัณฑ์ (7.5 1.b.ii), <cross join> ผ่าน <comma> (7.7 1.a) และเข้าร่วมกับ <เงื่อนไขการค้นหา> ผ่าน <comma> บวก WHERE (7.7 1.b )
ตามที่ Wikipedia กำหนดไว้:
ข้ามเข้าร่วม
CROSS JOIN ส่งคืนผลิตภัณฑ์คาร์ทีเซียนของแถวจากตารางในการเข้าร่วม กล่าวอีกนัยหนึ่งมันจะสร้างแถวที่รวมแต่ละแถวจากตารางแรกกับแต่ละแถวจากตารางที่สอง
เข้าร่วมภายใน
[... ] ผลลัพธ์ของการเข้าร่วมสามารถกำหนดเป็นผลลัพธ์ของการรับผลิตภัณฑ์คาร์ทีเซียนครั้งแรก (หรือการรวมข้าม) ของระเบียนทั้งหมดในตาราง (รวมทุกระเบียนในตาราง A กับทุกระเบียนในตาราง B) แล้วกลับมา เร็กคอร์ดทั้งหมดที่เข้าร่วมกับเพรดิเคต
"สัญกรณ์การเข้าร่วมโดยนัย" เพียงแสดงตารางสำหรับการเข้าร่วมในส่วนคำสั่ง FROM ของคำสั่ง SELECT โดยใช้เครื่องหมายจุลภาคเพื่อคั่นพวกเขา ดังนั้นจึงระบุการเข้าร่วมไขว้
Re OUTERร่วมและการใช้ ON VS WHERE ในพวกเขาดูเงื่อนไขใน LEFT JOIN (OUTER JOIN) VS INNER JOIN
เปรียบเทียบคอลัมน์ระหว่างตารางทำไม
เมื่อไม่มีแถวที่ซ้ำกัน:
ทุกตารางมีแถวที่สร้างคำสั่งจริงจากเทมเพลตคำสั่งแบบเติมคำเติม (มันทำให้เกิดข้อเสนอที่แท้จริงจาก - ตอบสนอง - เป็นคำกริยา (ลักษณะ) ที่แน่นอน)
ตารางฐานมีแถวที่สร้างคำสั่งจริงจากเทมเพลตคำสั่งที่กำหนดโดย DBA บางส่วน:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
ผลิตภัณฑ์ระดับกลางของการเข้าร่วมจะเก็บแถวที่สร้างข้อความจริงจากแม่แบบตัวถูกดำเนินการและของ:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
ON & WHERE เงื่อนไขเป็น ANDED เพื่อให้แม่แบบเพิ่มเติม ค่าเป็นอีกแถวที่ตรงกับแม่แบบนั้น:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
โดยเฉพาะอย่างยิ่งการเปรียบเทียบคอลัมน์สำหรับความเท่าเทียมกัน (SQL) ระหว่างตารางหมายความว่าแถวที่เก็บจากผลิตภัณฑ์จากส่วนของตารางที่รวมของเทมเพลตมีค่าเหมือนกัน (ไม่ใช่ค่า NULL) สำหรับคอลัมน์เหล่านั้น เป็นเพียงเรื่องบังเอิญที่แถวจำนวนมากจะถูกลบออกโดยการเปรียบเทียบความเท่าเทียมกันระหว่างตาราง - สิ่งที่จำเป็นและเพียงพอคือการกำหนดลักษณะของแถวที่คุณต้องการ
เพียงเขียน SQL สำหรับเทมเพลตสำหรับแถวที่คุณต้องการ!
ความหมายของข้อความค้นหา (และตารางเทียบกับเงื่อนไข) ดู:
วิธีรับข้อมูลที่ตรงกันจากตาราง SQL อื่นสำหรับคอลัมน์ที่แตกต่างกันสองคอลัมน์: Inner Join และ / หรือ Union
มีกฎง่ายๆในการสร้างแบบสอบถาม SQL จากคำอธิบายที่มนุษย์สามารถอ่านได้?
มากไป "ข้ามเข้าร่วม"
น่าเสียดายที่คำว่า "cross join" ใช้สำหรับ:
- ผลิตภัณฑ์ระดับกลาง
- ข้ามเข้าร่วม
- (ภายใน) เข้าร่วมกับ ON หรือ WHERE ที่ไม่ได้เปรียบเทียบคอลัมน์ใด ๆ จากตารางหนึ่งไปยังคอลัมน์อื่น ๆ (เนื่องจากสิ่งเหล่านี้มีแนวโน้มที่จะส่งคืนผลิตภัณฑ์แถวกลางจำนวนมาก)
ความหมายต่าง ๆ เหล่านี้ทำให้สับสน (เช่นในคำตอบและความคิดเห็นอื่น ๆ ที่นี่)
ใช้ CROSS JOIN กับ (INNER) เข้าร่วมกับเครื่องหมายจุลภาค
การประชุมสามัญคือ:
- ใช้ CROSS JOIN เมื่อคุณไม่เปรียบเทียบคอลัมน์ระหว่างตาราง นั่นคือการแสดงให้เห็นว่าการขาดการเปรียบเทียบเป็นไปโดยเจตนา
- ใช้ (ภายใน) เข้าร่วมกับเปิดเมื่อใดและเมื่อคุณเปรียบเทียบคอลัมน์ระหว่างตาราง (รวมถึงเงื่อนไขอื่น ๆ ที่อาจเป็นไปได้)
- อย่าใช้เครื่องหมายจุลภาค
โดยทั่วไปแล้วเงื่อนไขที่ไม่ได้อยู่ในคู่ของตารางจะถูกเก็บไว้สำหรับ WHERE แต่พวกเขาอาจจะต้องใส่ใน (n INNER) เข้าร่วมเพื่อให้ได้แถวที่เหมาะสมสำหรับการโต้แย้งเพื่อเข้าร่วม RIGHT, LEFT หรือ FULL (OUTER)
เรื่อง "อย่าใช้เครื่องหมายจุลภาค" การผสมจุลภาคกับ JOIN อย่างชัดเจนอาจทำให้เข้าใจผิดได้เนื่องจากเครื่องหมายจุลภาคมีลำดับความสำคัญต่ำกว่า แต่ด้วยบทบาทของผลิตภัณฑ์ระดับกลางในความหมายของ CROSS JOIN, (INNER) เข้าร่วมและเครื่องหมายจุลภาคอาร์กิวเมนต์สำหรับการประชุมข้างต้นไม่ได้ใช้เลยจะสั่นคลอน CROSS JOIN หรือเครื่องหมายจุลภาคก็เหมือนกับ (เข้า) เข้าร่วมที่อยู่ในสภาพที่เป็นจริง ผลิตภัณฑ์ระดับกลาง ON และตำแหน่งที่ทุกคนแนะนำและในเพรดิเคตที่สอดคล้องกัน อย่างไรก็ตามสามารถใช้ INNER JOIN ON ในการพูดสร้างแถวเอาต์พุตเฉพาะเมื่อค้นหาคู่ของแถวอินพุตที่ตรงตามเงื่อนไข ON แต่จะส่งคืนแถวเข้าร่วมไขว้ที่ตรงตามเงื่อนไข เหตุผลเดียวที่ ON ต้องเพิ่มเครื่องหมายจุลภาคใน SQL คือเขียนOUTERร่วม แน่นอนการแสดงออกควรทำให้ความหมายชัดเจน; แต่สิ่งที่ชัดเจนขึ้นอยู่กับความหมายของสิ่งต่าง ๆ
Re Venn diagram แผนภาพ Venn ที่มีวงกลมตัดกันสองวงสามารถแสดงให้เห็นถึงความแตกต่างระหว่างแถวเอาท์พุทสำหรับ INNER, LEFT, RIGHT & FULL JOIN สำหรับอินพุตเดียวกัน และเมื่อการเปิดโดยไม่มีเงื่อนไขจริงผลการเข้าร่วมภายในจะเหมือนกับ CROSS JOIN นอกจากนี้ยังสามารถแสดงแถวอินพุตและเอาต์พุตสำหรับ INTERSECT, UNION & EXCEPT และเมื่ออินพุตทั้งสองมีคอลัมน์เดียวกันผลลัพธ์ของ INTERSECT จะเหมือนกับของ SQL NATURAL JOIN มาตรฐานและผลลัพธ์ของ EXCEPT จะเหมือนกับของสำนวนบางตัวที่เกี่ยวข้องกับ LEFT & RIGHT JOIN แต่มันไม่ได้แสดงให้เห็นว่า (INNER) JOIN ทำงานอย่างไร ที่เพียงแค่ดูเหมือนว่าเป็นไปได้อย่างรวดเร็วก่อน มันสามารถระบุชิ้นส่วนของอินพุตและ / หรือเอาท์พุทสำหรับกรณีพิเศษของ ON, PKs (คีย์หลัก), FKs (foreign foreign) และ / หรือ SELECT ทั้งหมดที่คุณต้องทำเพื่อให้เห็นว่านี่คือการระบุว่าสิ่งที่เป็นองค์ประกอบของชุดที่แสดงโดยวงการ (ซึ่งงานนำเสนอที่ยุ่งเหยิงไม่ชัดเจน) (โปรดจำไว้ว่าโดยทั่วไปสำหรับการรวมแถวเอาท์พุทจะมีส่วนหัวที่แตกต่างจากแถวอินพุตและตาราง SQL เป็นถุงที่ไม่ได้ตั้งค่าแถวด้วย NULL )
CROSS JOIN
จะส่งผลในการรวมกันเป็นไปได้ทั้งหมดของตาราง เช่น Table1 ที่มี 100 แถวและ Table2 ที่มี 100 แถวจะส่งผลให้มี 10,000 รายการ