- PR -

テーブルデータの移行

1
投稿者投稿内容
yakip
会議室デビュー日: 2006/02/06
投稿数: 5
投稿日時: 2007-08-27 13:32
お世話になります。
Oracle初心者です。
只今、Oracleの複数のテーブルデータから一つのテーブル(TBL_C)にデータを移行したいのですがどうやれば実現できるか、悩んでおります。

▼テーブル構成
TBL_A
・BANGO
・USER_ID
・TOROKU_BI

TBL_B
・BANGO
・DATA01
・DATA02

TBL_C
・BANGO
・STATUS
・USER_ID
・TOROKU_BI

▼やりたいこと
1.TBL_AのBANGOを  TBL_Cにセット
2.TBL_AのUSER_IDを TBL_Cにセット
3.TBL_AのTOROKU_BIをTBL_Cにセット
4.TBL_AとTBL_B のBANGOが一致した場合は TBL_CのSTATUSに"1"をセット
一致しない場合は"0"をセット


1〜3までは以下の文で実現できることは確認と感じていますが、
4をどうやればよいかわかりません
参考になるサイトなどお教えいただけますと助かります。
どうぞよろしくお願いします。

declare
CURSOR c1 IS SELECT * FROM TBL_A;
BEGIN
--TBL_A
FOR r1 IN c1 loop
INSERT INTO TBL_C VALUES( r1.BANGO, ???, r1.USER_ID, r1.TOROKU_BI);
end loop;
end;
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2007-08-27 13:59
TBL_AとTBL_Bをouter join
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-08-27 14:31
KOXさんに対する補足
outer joinしたとき、TBL_Bにレコードがない場合、TBL_B.BANGO がNULLになるので、
NULLなら0、それ以外は1をセットする。
NULL判定はcase句を使えば実現できるでしょう。
バージョン書いてないから、caseが使えないかもしれないけど・・・

蛇足になりますが、今回の場合、ループを回しながらのinsert 〜 valueではなく、insert 〜selectの方が良いと思います。
#まぁ、移行だけだからどっちでも構わないっちゃー、構わない話だけど
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-08-27 16:00
Oracleの環境がないのですが。。。

ループさせなくても、insert〜select一発で実現可能です。
下記SQL例ではcase式を使っていますが、古いバージョンならdecode関数を使えば
可能と思います。

コード:
insert into TBL_C(BANGO,STATUS,USER_ID,TOROKU_BI)
 select
   TBL_A.BANGO,
   case when TBL_A.BANGO=TBL_B.BANGO then '1' else '0' end,
   TBL_A.USER_ID,
   TBL_A.TOROKU_BI
  from TBL_A
   left join TBL_B
    on TBL_A.BANGO=TBL_B.BANGO

yakip
会議室デビュー日: 2006/02/06
投稿数: 5
投稿日時: 2007-08-27 17:27
KOXさん、かずくんさん、忠犬さん
早速のご回答ありがとうございます。

忠犬さん、ズバリ答えを教えていただだきとても助かりました。

ありがとうございました。

未記入
会議室デビュー日: 2007/07/12
投稿数: 18
投稿日時: 2007-08-28 08:57
本当に解決したのでしょうか?
単純にLEFT JOINだと、TBL_BにあってTBL_Aに無いBANGOは移行されませんが、
それは問題になりませんか?
1

スキルアップ/キャリアアップ(JOB@IT)