ORACLE INSERT文を教えて下さい
いつもお世話になっております。
以下のような処理を実現したいのですが、どうしてもいい方法が見つかりません。
実現するINSERT文を教えて頂けないでしょうか?
よろしくお願いいたします
ー処理ー
TBL_Aを1レコードづつ読み込み、グループ情報のあるVIEWよりview_GRPCD取得し、TBL_Bへ出力する。
但し、グループ情報には、以下のように同一TENCDに対して複数のグループがヒットする為、日付の降順、
グループコードの降順で一番最初にヒットしたレコードのGRPCDを採用する。
【TBL_A】
│TENCD │SYOCD │URIAGE│
┼───┼───┼───┼
│10100 │ 0100 │1,000 │
│10200 │ 0100 │2,000 │
│10300 │ 0300 │3,000 │
│22200 │ 0200 │2,200 │
【View】
│NO│GRPCD │TENCD │ YMD │
┼─┼───┼───┼───┼
│01│ 010 │10100 │02/01 │
│02│ 010 │10200 │02/01 │
│03│ 010 │10300 │02/01 │
│04│ 020 │10200 │01/01 │
│05│ 030 │10100 │05/01 │→TENCD:10100はこれを採用
│06│ 030 │10300 │03/01 │→TENCD:10300はこれを採用
│07│ 040 │10100 │03/01 │
│08│ 040 │10200 │03/01 │→TENCD:10200はこれを採用
│09│ 040 │10300 │03/01 │
│10│ 050 │10400 │05/01 │
下記のほうに記載しているSQLで作成されるTBL_Bは以下のようになります
【TBL_B】(誤り)
│TENCD │GRPCD │SYOCD │URIAGE│
┼───┼───┼───┼───┼
│10100 │ 030 │ 0100 │1,000 │
│10200 │ 040 │ 0100 │2,000 │
│10300 │ 030 │ 0300 │3,000 │
本来TBL_Bは以下のようにView上に存在しないTBL_Aのレコードでも出力させたく
以下のような結果を求めたいと思っています。
【TBL_B】(正解)
│TENCD │GRPCD │SYOCD │URIAGE│
┼───┼───┼───┼───┼
│10100 │ 030 │ 0100 │1,000 │
│10200 │ 010 │ 0100 │2,000 │
│10300 │ 010 │ 0300 │3,000 │
│22200 │ 000 │ 0200 │2,200 │※※※このレコードを作成することが出来ません※※※
※SQLにある「NVL(View_GRPCD,0)」でVIEW上にないレコードの場合、GRPCDにゼロをセットして
出力できるかと思ったのですが、VIEW上にないレコードは作成されませんでした。
これを実現する方法を教えて頂きたいと思います。
■TBL_B(誤り)は作成できるSQL
CURSOR CUR_A IS
SELECT TENCD,SYOCD,SUM(URIAGE) FROM TBL_A GROUP BY TENCD,SYOCD ORDER BY TENCD,SYOCD;
BEGIN
OPEN CUR_A;
LOOP
FETCH CUR_1 INTO w_TENCD, w_SYOCD, w_URI;
EXIT WHEN CUR_A%NOTFOUND;
INSERT INTO TBL_B(
SELECT w_TENCD, NVL(View_GRPCD,0), w_SYOCD, w_URI
FROM (SELECT
View_TENCD,View_WRICD,View_GRPCD,
RANK() OVER(PARTITION BY View_TENCD ORDER BY View_YMD DESC, View_GRPCD DESC) w_RANK
FROM View
WHERE View_TENCD = w_TENCD)
WHERE w_RANK = 1);
END LOOP;
CLOSE CUR_A;
お礼
yamada_g 様 ご回答、ありがとうございます。 ご提示いただいた内容で処理を進めることが出来ました。 WHERE句の存在もなんとなく分かりかけてきました。 ありがとうございました。 また、よろしくお願いいたします。