PL/SQL Использование нескольких левых соединений
SELECT * FROM Table A LEFT JOIN TABLE B LEFT JOIN TABLE C
Из вышеприведенного фрагмента TABLE C оставит соединение (ТАБЛИЦА B) или (данные из таблицы A LEFT JOIN TABLE B) или (ТАБЛИЦА A)?
Ответы
Ответ 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)
Спасибо