SQL テーブルのWHERE句における結合条件とSELECT句のデータに対する処理の順番について
937925May 17 2012 — edited May 24 2012初歩的な質問で申し訳ありません。
DB : Oracle9i Enterprise Edition 9.2
前提:以下のようなテーブルを結合しで他を取得していました。
テーブルA(商品マスタ) 項目:商品コード、商品名
商品CD |商品名
-------------------
001 |自動車
002 |カメラ
テーブルB(商品明細) 項目:商品コード、入庫日、出庫日
商品CD |注文年月
-------------------
001 |201201
002 |-
この状態で、以下のようなクエリを書きました。
select a.商品CD
,a.商品名
,add_months(b.注文年月 || '01') 注文翌月
from テーブルA a
,テーブルB b
where a.商品CD = b.商品CD
and a.商品CD = '001'
商品CD 001 は入庫日・出庫日に日付を入れるが、
商品CD 002 は日付を入れないため、除外しています。
WHERE句で対象データを絞っているため、商品CD:001についてのみ注文年月翌月が取得されていたのですが、
あるタイミングからWHERE句より先に注文翌月算出の処理が先に走り、日付変換エラーとなりました。
再度アナライズを掛けたことで動きは基に戻りましたので、
アクセスパスが変わったことにより、テーブルA→テーブルBではなく、テーブルB→テーブルAという順番に処理されたようなのですが、SELECT句とWHERE句では必ずしもWHERE句が優先するわけではないということでしょうか。
例えば、以下のようにテーブルAがあり、
テーブルC
商品CD |商品名 |注文年月
----------------------------------------------
001 |自動車 |201201
002 |カメラ |-
以下のようなクエリを書いた場合でも、SELECT句の処理が優先されて日付変換エラーが発生することはあるでしょうか。
select c.商品CD
,c.商品名
,add_months(c.注文年月 || '01') 注文翌月
from テーブルC c
where c.商品CD = '001'