Osobliwa wielkość składni sprzężenia zewnętrznego Oracle

16

W zapytaniu, które miało zostać przeniesione ze składni sprzężenia zewnętrznego Oracle, do standardowej składni sprzężenia zewnętrznego SQL widziałem:

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

Teraz tłumaczenie zewnętrznej składni złączenia jest zwykle dość mechanicznym procesem, ale ta ostatnia linia mnie zaskoczyła. Co to znaczy? Jaki to ma wpływ?

Peter Eisentraut
źródło

Odpowiedzi:

11

Próbowałem wykonać proces mechaniczny. Mam nadzieję, że dobrze to pamiętam.

To prowadzi do:

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

Krótko mówiąc, myślę, że odpowiedź Leigh Riffel jest poprawna.

Uwaga

w dawnych czasach zasadą do zapamiętania było: wyrocznia, w której Aa = Bb (+) staje się Aa * = Bb w starej składni SQL-Server plus plus przechodzi na przeciwną stronę i staje się gwiazdą, co oznacza, że ​​lewe przyłączenie B na Aa = Bb

bernd_k
źródło
10

Linia wymaga, aby c.X_ID był równy stałej wartości lub aby nie było rekordu z tabeli C. Oczywiście, ponieważ pozostanie połączony, nie ograniczy rekordów z tabeli A, ograniczy tylko rekordy z tabeli C, które zostaną połączone. Oto demonstracja:

Ustawiać:

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;

Wyniki:

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;

Lub:

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
źródło