Внешнее объединение в подзапросе не возвращает значение - PullRequest
0 голосов
/ 05 ноября 2018

Допустим, у меня есть такая таблица:

Основной стол:

id | value
-----------
1  | 'not null'

Столовый стол:

id | value
-----------
2  | 'id does not match, whatever'

И оператор выбора вроде этого:

SELECT
  m.value without_join,
  (SELECT
     m.value with_join
   FROM
     joined_table j
   WHERE
     j.id(+) = m.id) joined
FROM
  main_table m;

Возвращенный результат выглядит следующим образом:

without_join | with_join
-------------------------
not null     | (null)

Внутреннее соединение выполняется вместо внешнего соединения, хотя я присоединился с оператором (+). Поскольку в подзапросе не выбрано ни одной строки, вместо m.value возвращается нулевое значение.

Поведение, которое я ожидал, заключалось во внешнем соединении j с m в подзапросе и, следовательно, возвращении ненулевого значения из таблицы m.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Полагаю, вы понимаете, почему это вернет NULL:

SELECT m.value as without_join,
       (SELECT m.value with_join
        FROM joined_table j
        WHERE j.id = m.id
       ) as joined
FROM main_table m;

Внутреннее соединение не соответствует.

Я могу понять вашу логику. Это выглядит как:

  • Подзапрос выполняет внешнее соединение (хотя и без явного синтаксиса join).
  • Он должен хранить все значения m, при заполнении j будут NULL значения для несоответствий.
  • Подзапрос возвращает одну строку.
  • Подзапрос выбирает столбец из m, поэтому он должен быть в наборе результатов.

Это не работает. Этот синтаксис внешнего соединения (по-видимому) работает, когда j и m находятся в одном и том же предложении FROM.

В любом случае подзапрос реализует внешнее объединение . Мое простое предположение состоит в том, что разработчики синтаксиса не реализовали функциональность рассмотрения подзапросов, поскольку подзапрос уже является внешним соединением. На данный момент документации по (+) уже не менее 20 лет, поэтому довольно сложно выяснить такие намерения.

Oracle заменил синтаксис (+) два десятилетия назад. Мой совет просто не использовать его. Это не рекомендуемый синтаксис для внешних объединений. И это не нужно для подзапросов.

0 голосов
/ 05 ноября 2018

Вы выбираете элементы из главной таблицы, а затем выбираете элементы из объединенной таблицы, где идентификатор во второй таблице совпадает с идентификатором элемента из основной таблицы. Поскольку во второй таблице нет элемента с id: 1, в другой таблице нет совпадений, поэтому результат равен нулю.

...