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'

在我看来,我可以完全删除第一个查询。是否存在删除第一个查询会产生影响的情况?

应该检查common_alias1.id上的外部联接条件,它没有影响,因为您也没有common_alias1.name上的外部连接。请参阅第二个表中的带有筛选条件的Oracle外部联接。

但回到你的问题:不,你不能删除第一部分,你从哪里得到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')
;

最新更新