Sonderfall der Oracle Outer Join-Syntax

16

Ich habe Folgendes in einer Abfrage gesehen, die von der Oracle-Outer-Join-Syntax auf die SQL-Standard-Outer-Join-Syntax portiert werden sollte:

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

Das Übersetzen der Outer-Join-Syntax ist normalerweise ein ziemlich mechanischer Vorgang, aber diese letzte Zeile hat mich verwirrt. Was bedeutet es? Welchen Effekt hat es?

Peter Eisentraut
quelle

Antworten:

11

Ich habe versucht, den mechanischen Prozess durchzuführen. Ich hoffe, ich erinnere mich richtig.

Dies führt zu:

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

Kurz gesagt, ich denke, Leigh Riffels Antwort ist richtig.

Hinweis

In alten Zeiten lautete die Regel zum Auswendiglernen: Orakel, wo Aa = Bb (+) zu Aa * = Bb wird. In der alten SQL-Server-Syntax wird das Pluszeichen zur entgegengesetzten Seite und zu einem Stern, was bedeutet, dass A links B auf Aa = Bb verbindet

bernd_k
quelle
10

Die Zeile erfordert, dass c.X_ID gleich dem konstanten Wert ist oder dass kein Datensatz aus der C-Tabelle vorhanden ist. Da es verbunden bleibt, werden die Datensätze aus der A-Tabelle nicht beschränkt, sondern nur die Datensätze aus der C-Tabelle, die verbunden werden. Hier ist eine Demonstration:

Installieren:

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;

Ergebnisse:

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;

Oder:

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
quelle