Tuhaf Oracle dış birleştirme sözdizimi davası


16

Oracle dış birleştirme sözdiziminden SQL standart dış birleşim sözdizimine taşınması gerekiyordu bir sorguda aşağıdakileri gördüm:

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(+)

Şimdi dış birleştirme sözdizimini çevirmek normalde oldukça mekanik bir işlemdir, ancak son satır beni şaşırttı. Bu ne demek? Ne gibi bir etkisi var?

Yanıtlar:


11

Mekanik işlemi yapmaya çalıştım. Umarım doğru hatırlıyorum.

Bu şunlara yol açar:

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

Kısacası Leigh Riffel'in cevabı doğru.

Not

eski günlerde ezberleme kuralı şuydu: burada Aa = Bb (+), Aa * = Bb SQL-Server eski sözdiziminde artı artı karşı tarafa gider ve bir yıldız olur, yani Aa = Bb'de A sol birleşimi B


10

Satır, c.X_ID değerinin sabit değere eşit olmasını veya C tablosundan kayıt olmamasını gerektirir. Tabii ki birleştirildiği için, A tablosundaki kayıtları sınırlamaz, yalnızca C tablosundaki birleştirilen kayıtları sınırlar. İşte bir gösteri:

Kurmak:

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;

Sonuçlar:

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;

Veya:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.