kom*_*it1 3 sql oracle oracle9i ansi-sql
我有以下两个版本的ANSI兼容SQL(列/表名称已更改以保护机密数据),其中一个版本通过遵循正确的逻辑而另一个不符合我的要求来满足我的要求.
1)ANSI Join 1-Works
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
Run Code Online (Sandbox Code Playgroud)
1)给出如下输出:
COLUMN_A COUNT(COLUMN_A)
--------------------------
A 0
B 0
C 1
D 1
E 0
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
2)&3)给出如下输出:
COLUMN_A COUNT(COLUMN_A)
--------------------------
C 1
D 1
Run Code Online (Sandbox Code Playgroud)
我理解(2,ANSI)和(3,所有权)是等价的.但是(1,ANSI)是否有任何等效的专有SQL?任何帮助都是最受欢迎的.谢谢.编辑:我已使用示例输出更新了问题.
您可能想要更改此条件:
AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)
Run Code Online (Sandbox Code Playgroud)
要么:
AND a.COLUMN_B (+) in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)
Run Code Online (Sandbox Code Playgroud)
或这个:
AND (a.COLUMN_B IS NULL OR a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5))
Run Code Online (Sandbox Code Playgroud)
但总的来说,我会说使用ANSI语法进行外连接.即使作为首先学习Oracle语法且对其非常熟悉的人,ANSI对于外连接也更清晰.