ไวยากรณ์เก่ามีเพียงรายชื่อตารางและการใช้WHERE
ข้อเพื่อระบุเกณฑ์การเข้าร่วมจะถูกคัดค้านในฐานข้อมูลที่ทันสมัยที่สุด
มันไม่ได้เป็นเพียงการแสดงไวยากรณ์เก่ามีความเป็นไปได้ที่จะคลุมเครือเมื่อคุณใช้ทั้ง INNER และ OUTER รวมในแบบสอบถามเดียวกัน
ผมขอยกตัวอย่างให้คุณ
สมมติว่าคุณมี 3 ตารางในระบบของคุณ:
Company
Department
Employee
แต่ละตารางมีหลายแถวเชื่อมโยงกัน คุณมีหลาย บริษัท และแต่ละ บริษัท สามารถมีหลายแผนกและแต่ละแผนกสามารถมีพนักงานได้หลายคน
ตกลงดังนั้นตอนนี้คุณต้องการทำสิ่งต่อไปนี้:
รายชื่อ บริษัท ทั้งหมดและรวมทุกแผนกและพนักงานทุกคน โปรดทราบว่าบาง บริษัท ยังไม่มีแผนกใด ๆ แต่ให้แน่ใจว่าคุณรวมไว้ด้วย ตรวจสอบให้แน่ใจว่าคุณดึงข้อมูลแผนกที่มีพนักงานเท่านั้น แต่จะแสดงรายการ บริษัท ทั้งหมดเสมอ
ดังนั้นคุณทำสิ่งนี้:
SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
AND Department.ID = Employee.DepartmentID
โปรดทราบว่าอันสุดท้ายมีการเข้าร่วมภายในเพื่อให้เป็นไปตามเกณฑ์ที่คุณต้องการเฉพาะแผนกกับบุคคล
ตกลงดังนั้นจะเกิดอะไรขึ้นตอนนี้ ปัญหาก็คือมันขึ้นอยู่กับเอ็นจิ้นฐานข้อมูลตัวเพิ่มประสิทธิภาพคิวรีดัชนีและสถิติของตาราง ให้ฉันอธิบาย
หากเครื่องมือเพิ่มประสิทธิภาพแบบสอบถามกำหนดว่าวิธีการทำเช่นนี้คือการทำ บริษัท ก่อนจากนั้นค้นหาแผนกและจากนั้นทำการเข้าร่วมภายในกับพนักงานคุณจะไม่ได้รับ บริษัท ใด ๆ ที่ไม่มีแผนก
สาเหตุของข้อนี้คือWHERE
ข้อใดเป็นตัวกำหนดแถวท้ายแถวในผลลัพธ์สุดท้ายไม่ใช่แต่ละส่วนของแถว
และในกรณีนี้เนื่องจากการเข้าร่วมทางซ้ายคอลัมน์ Department.ID จะเป็น NULL ดังนั้นเมื่อเข้าสู่ INNER JOIN to Employee ไม่มีวิธีใดที่จะบรรลุข้อ จำกัด ดังกล่าวสำหรับแถว Employee และจะไม่เกิดขึ้น ปรากฏ.
ในทางกลับกันหากเครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาตัดสินใจที่จะแก้ไขปัญหาการเข้าร่วมแผนกพนักงานก่อนแล้วจึงเข้าร่วมซ้ายกับ บริษัท คุณจะเห็นพวกเขา
ดังนั้นไวยากรณ์เก่าจึงไม่ชัดเจน ไม่มีวิธีที่จะระบุสิ่งที่คุณต้องการโดยไม่ต้องจัดการกับคำแนะนำแบบสอบถามและฐานข้อมูลบางอย่างไม่มีวิธีเลย
ป้อนไวยากรณ์ใหม่โดยคุณสามารถเลือกได้
ตัวอย่างเช่นหากคุณต้องการให้ทุก บริษัท ตามคำอธิบายปัญหาที่ระบุไว้นี่คือสิ่งที่คุณจะเขียน:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID
ที่นี่คุณระบุว่าคุณต้องการให้การเข้าร่วมแผนกพนักงานเป็นการเข้าร่วมครั้งเดียวจากนั้นออกจากการเข้าร่วมผลลัพธ์ที่ได้จาก บริษัท เหล่านั้น
นอกจากนี้สมมติว่าคุณต้องการแผนกที่มีตัวอักษร X ในชื่อของพวกเขาเท่านั้น คุณเสี่ยงต่อการสูญเสีย บริษัท เช่นกันหากไม่มีแผนกใด ๆ ที่มี X ในชื่อ แต่ด้วยไวยากรณ์ใหม่คุณสามารถทำสิ่งนี้ได้:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID AND Department.Name LIKE '%X%'
ส่วนเสริมพิเศษนี้ใช้สำหรับการเข้าร่วม แต่ไม่ใช่ตัวกรองสำหรับทั้งแถว ดังนั้นแถวอาจปรากฏขึ้นพร้อมข้อมูล บริษัท แต่อาจมี NULL ในคอลัมน์แผนกและพนักงานทั้งหมดสำหรับแถวนั้นเนื่องจากไม่มีแผนกที่มี X ในชื่อของ บริษัท นั้น นี่เป็นเรื่องยากสำหรับไวยากรณ์เก่า
นี่คือเหตุผลว่าทำไมในหมู่ผู้ขายรายอื่น Microsoft ได้คัดค้านไวยากรณ์การรวมภายนอกด้านนอกเก่า แต่ไม่ใช่ไวยากรณ์การเข้าร่วมด้านในเก่าตั้งแต่ SQL Server 2005 ขึ้นไป วิธีเดียวที่จะพูดคุยกับฐานข้อมูลที่ทำงานบน Microsoft SQL Server 2005 หรือ 2008 โดยใช้ไวยากรณ์การรวมภายนอกแบบเก่าคือการตั้งค่าฐานข้อมูลนั้นในโหมดความเข้ากันได้ 8.0 (aka SQL Server 2000)
นอกจากนี้วิธีเดิมโดยการวางตารางจำนวนหนึ่งที่เครื่องมือเพิ่มประสิทธิภาพคิวรีซึ่งมีส่วนคำสั่ง WHERE จำนวนหนึ่งซึ่งคล้ายกับการพูดว่า "คุณคือคนนี้ ด้วยไวยากรณ์ใหม่เครื่องมือเพิ่มประสิทธิภาพคิวรีจะทำงานได้น้อยลงเพื่อที่จะหาว่าส่วนใดประกอบกัน
ดังนั้นคุณมีมัน
ซ้ายและเข้าร่วมเป็นคลื่นแห่งอนาคต