我有一个这样的查询,我应该重构它:
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')
;