Caso de sintaxe de junção externa do Oracle peculiar

16

Eu vi o seguinte em uma consulta que deveria ser portada da sintaxe de junção externa do Oracle para a sintaxe de junção externa padrão do 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(+)

Agora, traduzir a sintaxe da junção externa é normalmente um processo bastante mecânico, mas essa última linha me deixou perplexo. O que isso significa? Que efeito isso tem?

Peter Eisentraut
fonte

Respostas:

11

Eu tentei executar o processo mecânico. Espero me lembrar direito.

Isto leva 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

Em suma, acho que a resposta de Leigh Riffel está correta.

Nota

antigamente, a regra para memorizar era: oracle onde Aa = Bb (+) se torna Aa * = Bb na sintaxe antiga do SQL Server, o sinal de mais vai para o lado oposto e se torna uma estrela, o que significa que A se junta à esquerda B em Aa = Bb

bernd_k
fonte
10

A linha requer que c.X_ID seja igual ao valor constante ou que não exista registro na tabela C. É claro que, como é deixado unido, não limitará os registros da tabela A, apenas limitará os registros da tabela C que são unidos. Aqui está uma demonstração:

Configuração:

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;

Resultados:

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