#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.