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 | ||||
---|---|---|---|---|---|
製品・サービス情報 |
|
||||
アンサー種別 | 設計/開発 |