Как переписать неявные объединения в явные объединения? - PullRequest
0 голосов
/ 06 сентября 2018

У меня проблемы с переписыванием этих JOINS с использованием явных объединений.Я пытаюсь понять, как это достигается.Вот оригинальный запрос, использующий неявные соединения, которые я унаследовал:

FROM prod.f31122 t,
       prod.f4801   wo,
       prod.f30008  r,
       prod.f0101   ab
WHERE t.wtdoco = wo.wadoco(+)
   and t.wtmmcu = wo.wammcu(+)
   and t.wtmmcu = r.iwmcu
   and t.wtan8 = ab.aban8

Я пробовал следующее, но получаю разные наборы результатов.Тот же счетчик, но набор результатов неверен (вероятно, проблема с моими группировками, которые не отображаются).Вот мой перевод с использованием явных объединений:

FROM prod.f31122 t      
JOIN prod.f4801 wo ON t.wtdoco = wo.wadoco
JOIN prod.f4801 wo ON wo.wammcu = t.wtmmcu 
JOIN prod.f30008 r ON t.wtmmcu = r.iwmcu 
JOIN prod.f0101 ab ON t.wtan8 = ab.aban8 

Я просто хочу убедиться, что мой перевод от неявных объединений к явным объединениям является логически правильным (для моего образования и понимания).Для справки, я могу сохранить неявные объединения, но я просто пытаюсь лучше понять этот процесс.

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018
FROM prod.f31122 t      
LEFT JOIN prod.f4801 wo ON t.wtdoco = wo.wadoco AND wo.wammcu = t.wtmmcu 
JOIN prod.f30008 r ON t.wtmmcu = r.iwmcu 
JOIN prod.f0101 ab ON t.wtan8 = ab.aban8 

Вы присоединяетесь к wo только один раз, и два условия объединения появляются в одном и том же предложении ON с логическим оператором AND между ними.

LEFT JOIN также можно записать как LEFT OUTER JOIN, а JOIN можно записать как INNER JOIN. Я предпочитаю эти более длинные фразы, так как они более явные.

0 голосов
/ 06 сентября 2018

Это не совсем правильно.

  1. Несколько критериев объединения реализованы с одним экземпляром таблицы и условиями AND
  2. (+) - это старый синтаксис Oracle для внешних объединений. JOIN по умолчанию использует INNER JOIN, поэтому вам нужно исправить это.

Так должно выглядеть так:

FROM prod.f31122 t      
LEFT OUTER JOIN prod.f4801 wo ON t.wtdoco = wo.wadoco
                              AND t.wtmmcu = wo.wammcu
JOIN prod.f30008 r ON t.wtmmcu = r.iwmcu 
JOIN prod.f0101 ab ON t.wtan8 = ab.aban8 
0 голосов
/ 06 сентября 2018

Эта часть неверна:

FROM prod.f31122 t      
JOIN prod.f4801 wo ON t.wtdoco = wo.wadoco
JOIN prod.f4801 wo ON wo.wammcu = t.wtmmcu 

Вы используете AND, чтобы сделать две вещи в одном соединении, а не два отдельных JOIN. Например:

FROM prod.f31122 t      
LEFT JOIN prod.f4801 wo
    ON t.wtdoco = wo.wadoco and wo.wammcu = t.wtmmcu 

Двойное использование «JOIN» буквально объединяет одну и ту же таблицу два раза, поэтому у вас будет две копии всех полей, основанных на разных условиях соединения.

Исправления

За комментарии @MathGuy & @AaronDietz Я переключил это на левое соединение из-за присутствия (+) в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...