Как сделать LEFT JOIN с двойным условием в синтаксисе Oracle? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть 2 таблицы.

1) машина таблица:

car table

2) param таблица:

param table

Мне нужно выбрать дубликаты автомобилей, у которых владелец совпадает с параметрами и НЕ отличаются страховка (это должно быть либо одинаково, либо отсутствует для обоих ).

Я успешно выполняю свой запрос с LEFT JOIN в синтаксисе ANSI:

SELECT owner.name, owner.value, COALESCE (insur.name, 'insurance'), insur.value, count(*)
FROM car INNER JOIN param owner ON car.id = owner.car_id
LEFT JOIN param insur ON car.id = insur.car_id AND insur.name = 'insur'
WHERE owner.name = 'owner'
GROUP BY owner.name, owner.value, insur.name, insur.value
HAVING count(*) > 1

SQL Fiddle с правильно работающим ANSI-синтаксисом

Но когда я переписал этот запрос со знаком (+) из синтаксиса Oracle вместо LEFT JOIN У меня другой результат:

SELECT owner.name, owner.value, COALESCE (insur.name, 'insurance'), insur.value, count(*)
FROM car,
     param owner,
     param insur
WHERE car.id = owner.car_id
  AND owner.name = 'owner'
  AND car.id (+) = insur.car_id -- key change
  AND insur.name = 'insur'
GROUP BY owner.name, owner.value, insur.name, insur.value
HAVING count(*) > 1

SQL Fiddle с неожиданным результатом (+) вместо LEFT JOIN

Результат этого запроса пуст.Я не понимаю, как переписать его в синтаксисе Oracle, чтобы получить тот же результат запросов.

1 Ответ

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

Это будет

SQL> select owner.name, owner.value,
  2    coalesce (insur.name, 'insurance') in_name,
  3    insur.value, count(*)
  4  from car, param owner, param insur
  5  where car.id = owner.car_id
  6    and car.id  = insur.car_id (+)
  7    and insur.name (+) = 'insur'
  8    and owner.name = 'owner'
  9  group by owner.name, owner.value, insur.name, insur.value
 10  having count(*) > 1;

NAME     VALUE    IN_NAME              VALUE      COUNT(*)
-------- -------- -------------------- -------- ----------
owner    John     insurance                              2

SQL>

Хотя, почему вы хотите использовать старый синтаксис внешнего соединения Oracle?По сравнению с соединениями ANSI у него есть только недостатки и нет преимуществ (по крайней мере, я не могу думать ни о каких).На самом деле, я знаю одно - если вы используете внешнее объединение в старых Forms & Reports 6i (или даже более старых? Я не думаю, что кто-то использует эти версии в настоящее время), их встроенный PL / SQL механизм можетне говорят ANSI-внешние соединения, поэтому вы обречены использовать старый (+) внешний оператор соединения.Кроме этого ... Нет, не знаю.

...