• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PLSQLについて)

PLSQLについて

このQ&Aのポイント
  • PLSQLを使用してtmpM商品単価からM商品単価へのインサートを行う際、重複する品番を除外する方法についての質問です。
  • コミットされる前に重複する品番の行もインサートされようとしてエラーが発生してしまいます。
  • 解決策を教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • byDesign
  • ベストアンサー率75% (45/60)
回答No.1

こんな感じでどうですか? BEGIN    INSERT INTO       M商品単価(品番,商品分類,売上単価,単価実行日,登録日時,登録者)    SELECT       A.品番,A.商品分類,A.売上単価,A.単価実行日,A.登録日時,A.登録者    FROM       tmpM商品単価 A,       (SELECT 品番,MAX(単価実行日) AS MAX_単価実行日 FROM tmpM商品単価 GROUP BY 品番) B,       (SELECT DISTINCT 品番 FROM M商品単価) C    WHERE       A.品番 = B.品番 AND       A.単価実行日 = B.MAX_単価実行日 AND       A.品番 = C.品番 (+)       C.品番 IS NULL;   out_val := SQL%ROWCOUNT; END;

miruchoko
質問者

お礼

有難うございます。 こんなに早くご回答頂けると思いませんでした。 大変参考になります。 すみません一つお教え頂きたいのですが、 A.品番 = C.品番 (+)の(+)はどういう意味でしょうか。 宜しくお願い致します。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • byDesign
  • ベストアンサー率75% (45/60)
回答No.2

>すみません一つお教え頂きたいのですが、 >A.品番 = C.品番 (+)の(+)はどういう意味でしょうか。 (+)はleft joinの事です 例えば、以下の(1)と(2)のSQL同等です (1) SELECT    TABLEA.* FROM    TABLEA,    TABLEB WHERE    TABLEA.CD =TABLEB.CD (+) (2) SELECT    TABLEA.* FROM    TABLEA       LEFT JOIN TABLEB ON          TABLEA.CD =TABLEB.CD A.品番 = B.品番 AND A.単価実行日 = B.MAX_単価実行日 AND ここで、単価実行日の最大のものに絞込み A.品番 = C.品番 (+) AND C.品番 IS NULL; ここで、既にM商品単価に入っている品番を除外しています。 先ほど書いたものは、 (+)の後にANDが抜けていましたので訂正します。    INSERT INTO       M商品単価(品番,商品分類,売上単価,単価実行日,登録日時,登録者)    SELECT       A.品番,A.商品分類,A.売上単価,A.単価実行日,A.登録日時,A.登録者    FROM       tmpM商品単価 A,       (SELECT 品番,MAX(単価実行日) AS MAX_単価実行日 FROM tmpM商品単価 GROUP BY 品番) B,       (SELECT DISTINCT 品番 FROM M商品単価) C    WHERE       A.品番 = B.品番 AND       A.単価実行日 = B.MAX_単価実行日 AND       A.品番 = C.品番 (+) AND // ←ANDが抜けてた       C.品番 IS NULL;

miruchoko
質問者

お礼

大変分かり易いご回答を頂きまして感謝致します。 今後とも宜しくお願い致します。

すると、全ての回答が全文表示されます。