Oracle luar bergabung dengan kasus sintaksis

16

Saya telah melihat yang berikut ini dalam kueri yang seharusnya porting dari Oracle outer join syntax ke 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(+)

Sekarang menerjemahkan sintaks join luar biasanya merupakan proses mekanis, tetapi baris terakhir membuat saya bingung. Apa artinya? Apa efeknya?

Peter Eisentraut
sumber

Jawaban:

11

Saya mencoba melakukan proses mekanis. Saya harap saya mengingatnya dengan benar.

Ini mengarah ke:

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

Singkatnya saya pikir jawaban Leigh Riffel benar.

Catatan

di masa lalu aturan untuk menghafal adalah: oracle di mana Aa = Bb (+) menjadi Aa * = Bb dalam SQL-Server sintaks lama plus bertambah ke sisi yang berlawanan dan menjadi bintang, yang berarti A kiri bergabung B pada Aa = Bb

bernd_k
sumber
10

Baris membutuhkan c.X_ID harus sama dengan nilai konstan atau tidak ada catatan dari tabel C. Tentu saja karena dibiarkan bergabung, itu tidak akan membatasi catatan dari tabel A, hanya membatasi catatan dari tabel C yang bergabung. Ini sebuah demonstrasi:

Mempersiapkan:

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;

Hasil:

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;

Atau:

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;
Leigh Riffel
sumber