ORACLE10gを使用しています。下記の●考えたSQLを作成しましたが、エラーにこそなりませんがレスポンスが返ってきません。
4つの参照テーブルのうち2テーブルが外部結合の場合の効率的な書き方のアドバイスをお願いします。
●やりたいこと
・AとB(主テーブル)から該当データ抽出
・Bの品番・得意先でCが存在すればCからコードを抽出し、Dが存在すればそのコードの名称をDから取得
・すごく簡単に書くと下記みたいなイメージです。エラーになりますが。
SELECT A.*,B.*,C.CD1,D.CD1NM,C.CD2,D.CD2NM,・・・
FROM A,B,C,D
WHERE
A.KEY1 = B.KEY1 AND
A.KEY2 = B.KEY2 AND
B.TOK_CD = C.TOK_CD(+) AND
B.HIN_CD = C.HIN_CD(+) AND
C.CD1 = D.CD1(+)・・・
●考えたSQL
SELECT
A.*,B.*,C.CD1,D.CD1NM,C.CD2,D.CD2NM,・・・
FROM
A,B,C,D
(
SELECT
C.MAKER_CD,
C.HIN_CD,
C.CD1,
C.CD2,
C.CD3
FROM
A,B,C
WHERE
A.KEY1 = 画面.指定 AND
A.KEY2 = 画面.指定 AND
B.MAKER_CD=C.MAKER_CD AND
B.HIN_CD = C.HIN_CD
)SUB_Q
WHERE
A.COL1 = 画面.指定 AND
A.COL2 = 画面.指定 AND
A.KEY1=B.KEY1 AND
A.KEY2=B.KEY2 AND
B.MAKER_CD = SUB_Q.MAKER_CD(+) AND
B.HIN_CD = SUB_Q.HIN_CD(+) AND
D.CD1(+) = SUB_Q.CD1 AND
D.CD2(+) = SUB_Q.CD2 AND
D.CD3(+) = SUB_Q.CD3
○参考
Dテーブルは大分類・中分類のような分類コードとその名称を管理するテーブルでCD1のみ値が入っていればそのレコードは大分類レコードでNAMEの値は大分類名という使用方法です。実際のSQLではDテーブルに別名を付けて、D1.CD1=** AND D1.CD2 IS NULL AND D.CD3 IS NULL ・・・とひとつずつ記述しますがここでは簡略化しています。
<レイアウトイメージ>
CD1|CD2|CD3|CD4|CD5|NAME
-----------------------
A|NULL|NULL|NULL|NULL|電化製品
A|a|NULL|NULL|NULL|冷蔵庫
お礼
アドバイスありがとうございます。 2段階に分けて記述するようにしてうまくいきました。 ありがとうございました。