Caso di sintassi del join esterno Oracle peculiare


16

Ho visto quanto segue in una query che doveva essere trasferita dalla sintassi del join esterno Oracle alla sintassi del join esterno standard SQL:

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

La traduzione della sintassi del join esterno è normalmente piuttosto un processo meccanico, ma quest'ultima riga mi ha sconcertato. Cosa significa? Che effetto ha?

Risposte:


11

Ho provato a eseguire il processo meccanico. Spero di ricordarlo bene.

Questo porta a:

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

In breve, penso che la risposta di Leigh Riffel sia corretta.

Nota

ai vecchi tempi la regola da memorizzare era: oracolo in cui Aa = Bb (+) diventa Aa * = Bb nella vecchia sintassi di SQL Server il plus va dalla parte opposta e diventa una stella, il che significa che un join sinistro B su Aa = Bb


10

La riga richiede che c.X_ID sia uguale al valore costante o che non vi siano record dalla tabella C. Naturalmente, poiché viene lasciato unito, non limiterà i record della tabella A, limiterà solo i record della tabella C che vengono uniti. Ecco una dimostrazione:

Impostare:

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;

risultati:

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;

O:

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.