กรณีการเข้าร่วม Oracle ภายนอกที่แปลกประหลาด


16

ฉันได้เห็นสิ่งต่อไปนี้ในแบบสอบถามที่ควรจะถูกย้ายจาก Oracle outer join syntax ไปเป็น SQL standard outer join syntax:

SELECT ...
FROM A, B, C, D, E
WHERE A.A_ID = B.A_ID
AND B.B_ID = C.A_ID(+)
AND B.B_KEY = C.B_KEY(+)
AND C.C_ID = D.C_ID(+)
AND B.A_ID = E.A_ID(+)
AND B.B_KEY = E.B_KEY(+)
AND 'CONSTANT' = C.X_ID(+)

ตอนนี้การแปลไวยากรณ์การรวมภายนอกนั้นเป็นกระบวนการทางกล แต่บรรทัดสุดท้ายนั่นทำให้ฉันงุนงง มันหมายความว่าอะไร? มีผลกระทบอะไรบ้าง

คำตอบ:


11

ฉันพยายามที่จะทำกระบวนการทางกล ฉันหวังว่าฉันจะจำได้ถูกต้อง

นี่นำไปสู่:

SELECT ...
FROM A
         join B on A.A_ID = B.A_ID
    left join C on B.B_ID = C.A_ID and B.B_KEY = C.B_KEY and 'CONSTANT' = C.X_ID
    left join D on C.C_ID = D.C_ID
    left join E on B.A_ID = E.A_ID and B.B_KEY = E.B_KEY

ในระยะสั้นฉันคิดว่าคำตอบของ Leigh Riffel นั้นถูกต้อง

บันทึก

ในสมัยก่อนกฎในการจดจำคือ: oracle ที่ Aa = Bb (+) กลายเป็น Aa * = Bb ในไวยากรณ์เก่าของ SQL-Server เครื่องหมายบวกจะไปทางด้านตรงข้ามและกลายเป็นดาวซึ่งหมายความว่า A ซ้ายเข้าร่วม B บน Aa = Bb


10

บรรทัดต้องการ c.X_ID จะเท่ากับค่าคงที่หรือไม่มีเรคคอร์ดจากตาราง C แน่นอนว่ามันถูกทิ้งให้เข้าร่วมมันจะไม่ จำกัด ระเบียนจากตาราง A เพียง จำกัด ระเบียนจากตาราง C ที่เข้าร่วมเท่านั้น นี่คือการสาธิต:

ติดตั้ง:

CREATE TABLE T1 as (select rownum+1 t1_id from dual connect by rownum <= 4);
CREATE TABLE T2 as (
   select rownum t1_id, DECODE(rownum,2,'CONSTANT',3,'NoMatch') CompareField 
   from dual connect by rownum <= 3
);
SELECT * FROM T1;
SELECT * FROM T2;

ผล:

SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1, T2
WHERE T1.t1_id = T2.t1_id(+)
AND 'CONSTANT' = T2.CompareField(+)
ORDER BY 1;

หรือ:

SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1 LEFT JOIN T2 ON T1.t1_id = T2.t1_id 
AND 'CONSTANT' = T2.CompareField
ORDER BY 1;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.