Проприетарные соединения Oracle — объединение на нескольких условиях

#sql #oracle #oracle9i #ansi-sql

#sql #Oracle #oracle9i #ansi-sql

Вопрос:

У меня есть следующие 2 версии ANSI-совместимого SQL (имена столбцов / таблиц изменены для защиты конфиденциальных данных), из которых одна из них удовлетворяет моим требованиям, следуя правильной логике, а другая — нет.

1)ANSI Join 1-Работает

 SELECT b.COLUMN_A,
  COUNT(a.COLUMN_A)
FROM TABLE1 a
RIGHT OUTER JOIN
  (SELECT COLUMN_A FROM TABLE2 WHERE COLUMN_X='TEST') b
ON  a.COLUMN_A = b.COLUMN_A
AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)  --WORKS
GROUP BY b.COLUMN_A
  

1) выдает результат, подобный этому:

 COLUMN_A  COUNT(COLUMN_A)
--------------------------
A       0
B       0
C       1
D       1
E       0
  

2)ANSI Join 2 -Не работает

 SELECT b.COLUMN_A,
  COUNT(a.COLUMN_A)
FROM TABLE1 a
RIGHT OUTER JOIN
  (SELECT COLUMN_A FROM TABLE2 WHERE COLUMN_X='TEST') b
ON  a.COLUMN_A = b.COLUMN_A
WHERE
a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)      --DOESN'T WORK
GROUP BY b.COLUMN_A
  

3) Проприетарное соединение Oracle — Не работает

 SELECT b.COLUMN_A,
  COUNT(a.COLUMN_A)
FROM TABLE1 a,(SELECT COLUMN_A FROM TABLE2 WHERE COLUMN_X='TEST') b
WHERE
a.COLUMN_A( ) = b.COLUMN_A
AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5) --DOESN'T WORK
GROUP BY b.COLUMN_A
  

2) и 3) выдает результат, подобный этому:

 COLUMN_A  COUNT(COLUMN_A)
--------------------------
C       1
D       1
  

Я понимаю, что (2, ANSI) и (3, ПРОПРИЕТАРНЫЕ) эквивалентны. Но существует ли какой-либо эквивалент проприетарного SQL для (1, ANSI)?.
Любая помощь была бы очень кстати.
Спасибо.
Редактировать: я обновил вопрос с помощью примера выходных данных.

Комментарии:

1. Вы могли бы рассмотреть возможность добавления информации, чтобы было ясно, как выглядит желаемый результат и что вы получаете в плохих ситуациях.

Ответ №1:

Вероятно, вы хотите изменить это условие:

 AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)
  

либо для этого:

 AND a.COLUMN_B ( ) in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)
  

или это:

 AND (a.COLUMN_B IS NULL OR a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5))
  

Но в целом, я бы посоветовал выполнять внешние соединения с синтаксисом ANSI. Даже для человека, который сначала изучил синтаксис Oracle и очень доволен им, ANSI намного понятнее для внешних соединений.

Комментарии:

1. Согласны с использованием синтаксиса соединения ANSI. Вы можете столкнуться с использованием внешних соединений в стиле Oracle ORA-01417 , для которых требуется вложенность (внешнее присоединение к подзапросу) или соединения ANSI.

2. Спасибо. Это работает!. Я согласен, что проприетарный синтаксис не очень аккуратен. Просто хотел узнать, каким образом он способен выполнять то, что делает ANSI join.