- 締切済み
AテーブルからBテーブルへの展開
表題のとおりAテーブルのデータを展開し、 BテーブルへINSERTするというPLSQLを考えています。 以下ような感じです。 Aテーブル No 列A1 列B1 列C1 列D1 列A2 列B2 列C2 列D2 列A3 列B3 列C3 列D3 -------------------------------------------------------------- 上記表のデータを Bテーブル No 列BA 列BB 列BC 列BD ------------------------- No 列A1 列B1 列C1 列D1 ←列名の末尾が1のもの No 列A2 列B2 列C2 列D2 ←列名の末尾が2のもの No 列A3 列B3 列C3 列D3 ←列名の末尾が3のもの と、いう感じでBテーブルへ。 Aテーブルの列名は”列A1”のように末尾に数字がついておりBテーブルへは 末尾が同じものを1レコードとしてINSERTします。 これを実現する方法として CURSOR csr IS SELECT * FROM ( SELECT 列A1 ,列B1 ,列C1 ,列D1 FROM Aテーブル UNION SELECT 列A2 ,列B2 ,列C2 ,列D2 FROM Aテーブル UNION SELECT 列A3 ,列B3 ,列C3 ,列D3 FROM Aテーブル ); 上記のようにカーソルで処理してINSERTする以外に方法がありますでしょうか 因みにこの例では1~3項目ですが実際には1~15項目まであります。 BテーブルへINSERTする列数も13列存在します。 DBはORACLE9iです
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
基本的に、taka_tetsuさんの回答であっていると思うのですが、 insert into Bテーブル select No,列A1,列B1,列C1,列D1 from Aテーブル union all select No,列A2,列B2,列C2,列D2 from Aテーブル union all select No,列A3,列B3,列C3,列D3 from Aテーブル ; 違いは、 (1) Noが忘れられている。 (2) UNION ALLの方が良い? (3) 余計なカッコをとった。 あたりです。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>上記のようにカーソルで処理してINSERTする以外に方法がありますでしょうか って、カーソルで処理する必要ないですよね。 insert into Bテーブル ( SELECT 列A1 ,列B1 ,列C1 ,列D1 FROM Aテーブル UNION SELECT 列A2 ,列B2 ,列C2 ,列D2 FROM Aテーブル UNION SELECT 列A3 ,列B3 ,列C3 ,列D3 FROM Aテーブル );
お礼
k_o_r_o_c_h_a_nさん、taka_tetsuさん回答有難うございます。 (1) Noが忘れられている。 → 忘れてました (2) UNION ALLの方が良い? → UNION ALLです(汗 >って、カーソルで処理する必要ないですよね。 私が勉強不足のためかもしれませんが、カーソルを使用したのは、重複データが存在した場合にログにそのデータを出力し、 その後insert処理を継続したいと考えていたからです。(この条件抜けていて済みません UNIONでは重複がでないため、表記の間違いです。すみません。 CURSOR csr IS SELECT * FROM SELECT 列A1~15 FROM Aテーブル UNION ALL SELECT 列B1~15 FROM Aテーブル UNION ALL ・・・(以降同様の列C~Oの13個のSELECT文 FOR-LOOPでひとつずつINSERTしようとしています。 実行計画をとってみたところ、それほどパフォーマンスが悪いわけでもなかったのですが、1万件を超えるデータを処理することを考えると、さらによい方法などありましたら、よろしくお願いします。