2011-04-29 122 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