2012-07-26 61 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

相关问题