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.name2番目の表のフィルター条件を使用した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 に答える