2011-04-29 123 views
3

我有以下两个版本的ANSI兼容SQL(列/表名更改为保护机密数据),其中一个通过遵循正确的逻辑来满足我的要求没有。Oracle专有连接 - 在多个条件下连接

1)ANSI加入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加入2- Doesn't工作

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,专有)是等效的。但是对于(1,ANSI)是否有任何等效的专有SQL? 任何帮助将是最受欢迎的。 谢谢。 编辑:我已经用示例输出更新了问题。

+0

您可能会考虑添加信息以清楚说明,所需输出的样子以及您在不良情况下得到的结果。 – EvilTeach 2011-04-29 15:00:39

回答

6

你可能想改变这种状况:

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连接。 – 2011-04-29 15:13:24

+0

谢谢。这工作!我同意专有语法不是很整齐。只是想知道它能够做什么ANSI加入。 – komedit1 2011-04-29 15:15:48