0

我有一个这样的查询,我应该重构:

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'

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

4

1 回答 1

1

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')
;
于 2012-07-27T05:54:35.087 回答