- ベストアンサー
ORACLE INSERT文の実現方法とは?
- ORACLEのINSERT文で、指定の条件に基づいてTBL_AからTBL_Bへデータを出力する方法を教えてください。
- TBL_Aから1レコードずつ読み込み、グループ情報のあるVIEWから最新のview_GRPCDを取得し、TBL_Bへ出力します。
- しかし、VIEW上に存在しないTBL_AのレコードもTBL_Bに出力したいため、この要件を満たすINSERT文を作成したいと思っています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
検証できる環境が今ないのですが、カーソルを使わず外部結合を使えばいいのではないでしょうか。 SELECT A.ENCD, NVL(View_GRPCD,0), A.SYOCD, A.URI FROM (SELECT TENCD,SYOCD,SUM(URIAGE) URI FROM TBL_A GROUP BY TENCD,SYOCD ORDER BY TENCD,SYOCD) A left join ( select View_TENCD,View_WRICD,View_GRPCD 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 w_RANK = 1 ) on View_TENCD = w_TENCD
その他の回答 (2)
- yamada_g
- ベストアンサー率68% (258/374)
>VIEW上にないレコードは作成されませんでした。 とありますが、 >FROM View >WHERE View_TENCD = w_TENCD としているので存在しないTENCDのデータは取得できないので当然ですね。 他の回答者様も言っているように、外部結合すれば問題ないと思います。 --全角でインデントしてます。 INSERT INTO TBL_B SELECT A.TENCD,NVL(B.GRPCD,'000'),A.SYOCD,A.URIAGE FROM TBL_A A LEFT JOIN ( SELECT GRPCD,TENCD FROM ( SELECT GRPCD,TENCD ,ROW_NUMBER() OVER(PARTITION BY TENCD ORDER BY YMD DESC,GRPCD DESC) RNUM FROM V) WHERE RNUM = 1 ) B ON A.TENCD = B.TENCD; No.2様の考え方と同様ですが、No.2様のそのままのSQLだと内側のサブクエリが期待どおりにならないと思います。 where rownum = 1 の条件はorder by より先に適用されるので 降順で並べた1件目、にはならないはずです。(たまたまなる時もあるかもしれませんが) select * from (select * from tbl order by ソート条件) where rownum = 1 という風に一旦ソートしたサブクエリを作る必要があります。
お礼
yamada_g 様 ご回答ありがとうございます。 >where rownum = 1 の条件はorder by より先に適用されるので この辺りの適用される順番についてあまり理解していなかったので、 今までのロジックも見直してみました。 ご提示頂いたSQLも参考にさせて頂きたいと思います。 いつもありがとうございます。
- nda23
- ベストアンサー率54% (777/1415)
1レコードずつ処理しているようですが、1発でできますよ。 先ず、理論の展開を考えると、以下のようになります。 (1)Viewを日付、グループコードの降順でソートしたものの 先頭1レコードを返すサブクエリ (2)TBL_Aと上記サブクエリをOUTER JOINしたクエリを 元にしてTBL_Bに挿入 これを元にSQLを組み立てます. INSERT INTO TBL_B SELECT A.TENCD, DECODE(B.GRPCD,NULL,'000',B.GRPCD) GRPCD, A.SYOCD,A.URIAGE FROM TBL_A A LEFT JOIN (SELECT View_GRPCD GRPCD FROM View WHERE ROWNUM=1 ORDER BY View_YMD DESC, View_GRPCD DESC) B ON A.GRPCD=B.GRPCD こんな感じですが如何でしょう。
お礼
nda23 様 ご回答、ありがとうございます。 やはり、カーソルにする必要は無いようですね。 頂いたSQLを今回の仕様にじっくり適用してみようと思います。 (まだ皆様のようにすぐには理解出来ないので・・・) 大変ありがとうございました。 またよろしくお願いします
お礼
nora1962 様 ご回答、ありがとうございます。 そうですね、カーソル必要ないかも(仕様の段階で「カーソルでまわせばいい」と 言われたので、その方法しか無いと思っていました) 頂いたSQLをじっくり適用してみようと思います。 (まだ皆様のようにすぐには理解出来ないので・・・) いつもありがとうございます。 またよろしくお願いします