2012-07-26 59 views
0

我有這樣的查詢該我應該重構同桌:Oracle查詢:用不同的別名,但相同的選擇兩次where子句過濾

SELECT * 
    FROM a a1 
     ,b common_alias 
     ,b common_alias1 
WHERE a1.id = common_alias.id(+) 
    AND a1.id = common_alias1.id(+) 
    AND common_alias.name = 'XYZ' 
    AND common_alias1.name = 'XYZ' 
UNION 
SELECT * 
    FROM a a1 
     ,b common_alias 
     ,b common_alias1 
WHERE a1.id = common_alias.id(+) 
    AND a1.id = common_alias1.id(+) 
    AND common_alias.name = 'XYZ' 
    AND common_alias1.name = 'PQR' 

在我看來,我可以刪除第一個查詢完全。是否有任何情況下刪除第一個查詢將有所作爲?

回答

1

您應該檢查您的外部連接條件common_alias1.id,因爲您沒有外部連接common_alias1.name,所以它不起作用。見Oracle outer join with filter condition on the second table

但回到你的問題:不,你不能刪除第一部分,你會在哪裏得到XYZ | XYZ排?以http://sqlfiddle.com/#!4/c7dfa/12爲例。

但是你可以重構爲

SELECT a1.*,common_alias.name n1,common_alias1.name n2 
    FROM a a1 
     ,b common_alias 
     ,b common_alias1 
WHERE a1.id = common_alias.id(+) 
    AND a1.id = common_alias1.id(+) 
    AND common_alias.name = 'XYZ' 
    AND (common_alias1.name = 'XYZ' OR common_alias1.name = 'PQR') 
; 
+0

感謝你的解釋超出去。非常感謝它,先生。 – Victor 2012-07-27 15:44:23

+0

我想我也可以做:select * from a,(select * from b where b.name ='XYZ')alias1,(select * from b where b.name ='PQR')alias2 where a.id = alias1 .id(+)和a.id = alias2.id(+) – Victor 2012-07-27 16:15:23

相關問題