アプリ版:「スタンプのみでお礼する」機能のリリースについて

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|冷蔵庫

A 回答 (1件)

一番判りやすいのは、



select * from (select * from a,b,c where ~
) as x,d where ~;

のように、2段階に分けることかと思います。

ただ、説明にあるようなデータの意味合いから行けば、

select * from a,b,(select * from c,d where 内部結合条件) where ~;

のような書き方が考えらるような気がします。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
2段階に分けて記述するようにしてうまくいきました。
ありがとうございました。

お礼日時:2006/10/23 17:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す