Подтвердить что ты не робот

PL/SQL Использование нескольких левых соединений

SELECT * FROM Table A LEFT JOIN TABLE B LEFT JOIN TABLE C

Из вышеприведенного фрагмента TABLE C оставит соединение (ТАБЛИЦА B) или (данные из таблицы A LEFT JOIN TABLE B) или (ТАБЛИЦА A)?

4b9b3361

Ответ 1

ТАБЛИЦА C оставит   1. (ТАБЛИЦА B) или 2. (данные из таблицы A LEFT JOIN ТАБЛИЦА B) или 3. (ТАБЛИЦА A)?

Второй. Но кодирование соединения поможет вам понять больше.

Вы можете написать:

SELECT * 
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.ID = C.ID)

Но вы можете:

SELECT * 
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code)

Итак, вы можете присоединяться к каждому полю из предыдущих таблиц и присоединяться к "результату" (хотя движок может выбрать способ получения результата) предыдущих объединений.

Подумайте о левом соединении как о некоммутативной операции (A left join B не совпадает с B left jon A). Таким образом, порядок важен, а C будет оставлен присоединенным к предыдущим объединенным таблицам.

Ответ 2

документация Oracle достаточно подробно описывает, как обрабатываются соединения:

Чтобы выполнить объединение трех или более таблиц, Oracle сначала присоединяется к двум таблицы, основанные на условиях объединения, сравнивающих их столбцы и затем соединяет результат с другой таблицей на основе условий соединения содержащие столбцы объединенных таблиц и новую таблицу. оракул продолжает этот процесс, пока все таблицы не будут объединены в результат.

Это логический подход к обработке объединений и соответствует стандарту ANSI (другими словами, все механизмы базы данных обрабатывают соединения в порядке).

Однако, когда запрос действительно выполняется, оптимизатор может выбрать запуск объединений в другом порядке. Результат должен быть логически таким же, как обработка объединений в порядке, указанном в запросе.

Кроме того, условия соединения могут вызвать некоторые неожиданные условия. Поэтому, если у вас есть:

from A left outer join
     B
     on A.id = B.id left outer join
     C
     on B.id = C.id

Тогда у вас может быть условие, когда A и C имеют строку с определенным идентификатором, но B нет. С этой формулировкой вы не увидите строку в C, потому что она присоединяется к NULL. Поэтому будьте осторожны с условиями соединения на left outer join, особенно при присоединении к таблице, отличной от первой таблицы в цепочке.

Ответ 3

Вам нужно указать имя столбца правильно, чтобы выполнить запрос. Скажем, если вы используете:

SELECT * 
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code)

Затем вы можете получить следующую ошибку:

ORA-00933: команда SQL не была закончена.

Чтобы избежать этого, вы можете попробовать:

SELECT A.id as "Id_from_A", B.code as "Code_from_B"
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id)
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code)

Спасибо