OUTER JOINでの抽出条件指定の記述方法について

以下の例にあるようなSQL文において、TBL_Aに対する抽出条件指定(1)は、性能面/処理面からON探索条件とWHERE句のどちらに記述すればよいですか?

[SQL文の例]

 SELECT.....
 FROM TBL_A LEFT OUTER JOIN TBL_B
 ON TBL_A.基準日 = 19990930...(1)

 AND TBL_A.基準日 = TBL_B.基準日
 AND TBL_A.店番 = TBL_B.店番
 AND TBL_A.取引先番号 = TBL_B.取引先番号
 WHERE TBL_A.基準日 = 19990930...(1)

 AND TBL_B.基準日 = 19990930
条件をどちらに記述するかは、性能面から決まるものではありません。それは、ON探索条件とWHERE句の探索条件では、SQL文の意味が変わるからです。

  • ON探索条件
    これは、表を結合するときの条件として働きます。この条件が偽のとき、LEFT OUTER JOINでは右表の結合結果がNULLに、RIGHT OUTER JOINでは左表の結合結果がNULLになります。なお、結合結果は、LEFTなら左表のレコードのすべてを対象とした結合結果となり、RIGHTなら右表のレコードのすべてを対象とした結合結果となります。


  • WHERE句の探索条件
    これは、FROM句に記述される表からレコードを抽出するときの条件として働きます。(INNER)結合条件ならば、表と表をネステドループ結合(繰り込み結合)した結果表からの抽出条件として働きます。指定した条件は、表からレコードを抽出するときの条件として働きます。なお、FROM句がOUTER JOINのとき、OUTER結合した結果表(結合表)からレコードを抽出するときの条件として働きます。


したがって、求める結果が「基準日=19990930」だけのレコードに限定したいときは、WHERE句の探索条件にその条件を記述してください。(ON探索条件に記述すると、その条件が偽であろうがなかろうが、LEFTでは左表のレコードを抽出し、RIGHTでは右表のレコードを抽出してしまうからです。)
なお、ON探索条件に(1)が記述されず、WHERE句の探索条件には(1)の条件が記述されたとします。このとき、Symfowareでは、TBL_Aの表からレコードを抽出するとき(OUTER結合する前に)、(1)の条件の下でレコードを抽出します。すなわち、(1)がDSIを限定する条件であれば、DSIを限定して表をアクセスすることになります。

製品・サービス区分 Symfoware
製品・サービス情報
対象製品 Symfoware Server (Native Interface)
プラットフォーム Windows, Solaris, Linux
アンサー種別 設計/開発
このページの先頭へ