• 締切済み

2つの表の整合をとる方法

こんにちは、 オラクルで2つの同じ表を同じデータに保つ方法について悩んでいます。 A表、B表共 COL1 プライマリキー COL2 COL3 として。 両テーブルのデータをあわせこみたいのですが、 過去ログを調べたところ、他方に無いデータの獲得についてはありましたのでそれを参考にINSERT文を作成しました。 INSERT INTO B ( SELECT * FROM A WHERE NOT EXISTS ( SELECT * FROM B WHERE A.COL1 = B.COL1 )) 上記SQLでAにあってBにないレコードがBに追加される事を確認しましたが、 COL1が同じでCOL2またはCOL3が違う場合の UPDATE文をどの様に記述すればよいか分かりません。 どなたかご教授願えないでしょうか?。

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>update B set (COL2, COL3) = (A.COL2, A.COL3) >where NOT EXISTS ( >SELECT * FROM B >WHERE A.COL1 = B.COL1 >) select文1つ抜けてましたね。失礼しました。 update B set (COL2, COL3) = (A.COL2, A.COL3) where COL1 = (select COL1 from A WHERE A.COL1 = B.COL1 and NOT EXISTS ( SELECT * FROM B B2 WHERE A.COL1 = B2.COL1 ) これでいくかな?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>COL1が同じでCOL2またはCOL3が違う場合の >UPDATE文をどの様に記述すればよいか分かりません。 >どなたかご教授願えないでしょうか?。 update B set (COL2, COL3) = (A.COL2, A.COL3) where NOT EXISTS ( SELECT * FROM B WHERE A.COL1 = B.COL1 ) Oracleということなんで、これでいけるかな?

123425
質問者

お礼

ご回答ありがとうございます。 上記SQLでためさせて頂きましたところ、 update B set (COL2, COL3) = (A.COL2, A.COL3) where NOT EXISTS ( SELECT * FROM A ←BとなっていましたがAとしました。 WHERE A.COL1 = B.COL1 ) update B set (COL2, COL3) = (A.COL2, A.COL3) ここのA.COL2,A.COL3で”列名が無効です”エラーが出ます。 Aテーブルを記述する箇所が無いからでしょうか? もしよろしければもう少しお付き合い願います。

回答No.1

こんにちは。  トリガーを使用して、変更を他表にも反映させる。ただし、ユーザが「変更」を行えるのは、トリガーを設置した表に制限する。 UPDATE B SET COL2 = (SELECT COL2 FROM A WHERE COL1 = value), COL3 = (SELECT COL3 FROM A WHERE COL1 = value) WHERE COL1 = value

123425
質問者

補足

早速のご回答ありがとうございます。 質問のしかたが悪かった様です、 2つの表をあるタイミングで 照らし合わせて整合をとりたいのです。 (トリガを利用して運用し、 週に一度チェックをするとか。 あまり意味の無いことですが...)

関連するQ&A