• 締切済み

サブクエリでの抽出について

●趣旨 下記のテーブルを参照しデータを抽出したいのですが、うまくいきません。 前回の質問に近い内容ですが是非アドバイスをお願いします。 【在庫ファイル】 品番 メーカー 0001 A 0001 B 【棚卸ファイル】 棚卸日 品番 メーカー 2005/10/10 0001 A 2006/10/10 0001 B 【商品情報M】 品番 メーカー 適用日 原価 0001 A 2004/01/01 500 0001 A 2005/01/01 1000 0001 A 2006/01/01 2000 0001 C 2005/01/01 5000 ☆画面でメーカー指定:A~B 【求める結果】 品番 メーカー 原価 0001 A 1000(棚卸ファイル.棚卸日以前のデータ内でMAX(適用日)の原価) 0001 B 0(←商品情報に存在しない場合は0にする) SELECT 在庫ファイル.品番, 在庫ファイル.メーカー, NVL(商品情報.原価,0) FROM 商品情報M, 在庫ファイル, 棚卸ファイル, ( SELECT 品名情報M.品番, 品名情報M.メーカー, MAX(品名情報M.適用日) MAX日付 FROM 商品情報M, 在庫ファイル, 棚卸ファイル WHERE 在庫ファイル.メーカー = 商品情報M.メーカー AND 在庫.品番 = 商品情報M.品番 AND 棚卸ファイル.棚卸日 >= 商品情報M.適用日 )SUB_Q WHERE SUB_Q.MAX日付(+) = 商品情報M.適用日 AND 在庫ファイル.メーカー = SUB_Q.メーカー(+) AND 在庫ファイル.品番 = SUB_Q.品番(+) ●やりたいこと ・在庫ファイル・棚卸ファイルを主テーブルとして、対象の品番・メーカーを抽出し、 その品番・メーカーの原価を結果として返したいです。 ・原価は棚卸日以前のMAX(適用日)のものを取得したいです。 ●現状 上記のようなSQLを作成したのですが、結果は 主テーブルに存在しないメーカーCの原価を取得してしまい、 原価だけが異なる複数レコードが取得されてしまいます。

みんなの回答

回答No.1

結合条件が不完全だからじゃないですかね。 SELECT 在庫ファイル.品番, 在庫ファイル.メーカー, NVL(商品情報.原価,0) FROM 商品情報M, 在庫ファイル, /* 邪魔 棚卸ファイル, */ ( SELECT 品名情報M.品番, 品名情報M.メーカー, MAX(品名情報M.適用日) MAX日付 FROM 商品情報M, 在庫ファイル, 棚卸ファイル WHERE 在庫ファイル.メーカー = 商品情報M.メーカー AND 在庫.品番 = 商品情報M.品番 AND 棚卸ファイル.棚卸日 >= 商品情報M.適用日 /* 追加 */ AND /* 追加 */ 在庫ファイル.メーカー = 棚卸情報ファイル.メーカー AND /* 追加 */ 在庫ファイル.品番 = 棚卸情報ファイル.品番 )SUB_Q WHERE SUB_Q.MAX日付(+) = 商品情報M.適用日 AND 在庫ファイル.メーカー = SUB_Q.メーカー(+) AND 在庫ファイル.品番 = SUB_Q.品番(+) ;

karen237
質問者

お礼

サブクエリではなくメインのWHERE条件に  SUB_Q.品番 = 商品情報M.品番 AND  SUB_Q.メーカー = 商品情報M.メーカー AND  SUB_Q.品番 = 棚卸情報ファイル.品番 AND  SUB_Q.メーカー = 棚卸情報ファイル.メーカー を追加したら上手くいきました。 現在、抽出されているデータを念入りに確認すればよかったです。 ヒントを頂いてとても助かりました。ありがとうございました。