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

いつもお世話になっております。再度、解決できないSQLの問題が発生してしまいました。
識者の方よろしくお願いします。

環境:Oracle10g ストアドプロシージャ

(1)参照テーブル
 TEMP1(キー:契約番号、連番),TEMP2(キー:連番、契約種類CD),
 タイプマスタ(キー:契約種類CD、タイプCD)

(2)追加テーブル対象
 契約明細(キー:契約番号,タイプCD)

実施したい事は(2)に保存されていない、(1)のデータを
(2)に入れたいです。(1)のTEMP1、TEMP2には追加更新対象のデータが保存されています。

タイプマスタの参照はTEMP2にはタイプCDが存在していない為、
TEMP2.契約種類CDからタイプCDを導出しています。

実現出来ていないことなのですが
NOT EXISTSの結果が伴わないので
INSERTが正しく出来ずに困っております。


INSERT INTO 契約明細 (
契約番号
,タイプCD
)
SELECT distinct
A.契約番号
,C.タイプCD
FROM TEMP1 A INNER JOIN
TEMP2 B
ON A.連番 = B.連番
INNER JOIN タイプマスタ C ON B.契約種類CD = C.契約種類CD
LEFT JOIN 契約明細 D ON C.タイプCD = D.タイプCD
WHERE NOT EXISTS(
select 'X' FROM TEMP1 INNER JOIN
TEMP2
ON TEMP1.連番 =TEMP2.連番
INNER JOIN タイプマスタ ON タイプマスタ.契約種類CD = TEMP2.契約種類CD AND タイプマスタ.契約種類CD = C.契約種類CD
INNER JOIN 契約明細 ON 契約明細.タイプCD = タイプマスタ.タイプCD AND 契約明細.タイプCD = D.タイプCD
) ;

よろしくお願いいたします。

A 回答 (1件)

こんな感じでどうでしょうか?



insert into 契約明細
select distinct temp1.契約番号, タイプマスタ.タイプCD
from temp1
inner join temp2 on (temp1.連番 = temp2.連番)
inner join タイプマスタ on (temp2.契約種類CD = タイプマスタ.契約種類CD)
where not exists (
select * from 契約明細
where 契約明細.契約番号 = temp1.契約番号
and 契約明細.タイプCD = タイプマスタ.タイプCD);

それぞれのテーブルの関連がよくわからないので、これでは上手くいかないようならそれも提示してください。
distinctが必要だということは1対1ではないのですかね。
具体的なサンプルデータもある方が回答するかたが分かりやすいと思いますよ。
    • good
    • 0
この回答へのお礼

大変助かりました。何時もありがとうございます。

お礼日時:2011/03/23 23:25

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