Своєрідний випадок синтаксису зовнішнього з'єднання Oracle


16

У запиті, який повинен був бути перенесений із синтаксису зовнішнього приєднання Oracle до синтаксису зовнішнього приєднання 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(+)

Зараз переклад синтаксису зовнішнього з'єднання зазвичай є досить механічним процесом, але цей останній рядок мене збентежив. Що це означає? Який ефект це має?

Відповіді:


11

Я намагався виконати механічний процес. Я сподіваюся, що пам’ятаю це правильно.

Це призводить до:

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

Коротше кажучи, я вважаю, що відповідь Лей Ріффеля є правильною.

Примітка

за старих часів правилом запам’ятовування було: oracle, де Aa = Bb (+) стає Aa * = Bb у старому синтаксисі SQL-Server плюс переходить у протилежну сторону і стає зіркою, а це означає, що лівий приєднується B на Aa = Bb


10

Рядок вимагає, щоб c.X_ID дорівнював постійному значенню або не було запису з таблиці С. Звичайно, оскільки він залишився приєднаним, він не обмежує записи з таблиці А, обмежує лише записи з таблиці С, які приєднуються. Ось демонстрація:

Налаштування:

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;

Результати:

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;

Або:

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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.