Cas particulier de syntaxe de jointure externe Oracle


16

J'ai vu ce qui suit dans une requête qui était censée être portée de la syntaxe de jointure externe Oracle vers la syntaxe de jointure externe SQL standard:

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

Maintenant, traduire la syntaxe de jointure externe est normalement un processus assez mécanique, mais cette dernière ligne m'a dérouté. Qu'est-ce que ça veut dire? Quel effet cela a-t-il?

Réponses:


11

J'ai essayé d'effectuer le processus mécanique. J'espère que je m'en souviens bien.

Cela mène à:

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

En bref, je pense que la réponse de Leigh Riffel est correcte.

Remarque

autrefois, la règle à mémoriser était: oracle où Aa = Bb (+) devient Aa * = Bb dans l'ancienne syntaxe SQL-Server, le plus va du côté opposé et devient une étoile, ce qui signifie que la jointure gauche B sur Aa = Bb


10

La ligne requiert que c.X_ID soit égal à la valeur constante ou qu'il n'y ait aucun enregistrement de la table C. Bien sûr, comme il est joint, il ne limitera pas les enregistrements de la table A, mais uniquement les enregistrements de la table C qui seront joints. Voici une démonstration:

Installer:

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;

Résultats:

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;

Ou:

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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.