MySQL のSQL文の書き方についての質問です。

table A,Bともに uid,name の項目があります。やりたいことはuid に関するA,Bの差分処理です。
uid はユニークキーです。

1. A から、 Bにない uidのデータを削除する
2. A に Bにのみあるuid のデータを追加する。

table A には、uid,name 以外にも項目ありますので、いれかえるわけにはいきません。
これは、それぞれ1つのSQL文で可能なのでしょうか? バージョンにより可能不可能も
あるかと思いますのでよろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/03/27 12:19:38
  • 終了:2008/04/03 12:20:02

回答(3件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912008/03/27 12:52:01

ポイント27pt

前者はひとつのSQL 実行できると思います。

DELETE FROM tableA WHERE uid NOT IN ( SELECT uid FROM tableB)

(データの削除ですので、テスト環境等で動作を確認ご使用ください。)


後者は、MySQL のバージョンが5以上であればストアドプロシージャで処理すれば、保守が簡単かと思いますが、

プロシージャが使用できない場合は以下のような方法もあると思います。

SELECT CONCAT('INSERT INTO tableA (uid, name) VALUES (', uid, ', \'', name, '\');' )
FROM tableB WHERE uid NOT IN ( SELECT uid FROM tableA )

これで実行された結果をSQL として実行すれば、結果として後者を実現できるかと思います。

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_14.htm

http://dev.mysql.com/doc/refman/5.1/ja/stored-procedures.html

id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402008/03/27 13:01:12

ポイント27pt

1.はサブクエリがいるので基本的には MySQL4.1 以上。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.2 サブクエリ構文

DELETE FROM A WHERE uid NOT EXISTS ( SELECT * FROM B WHERE B.uid = A.uid )

2.はサブクエリの方が分かりやすいけど、これなら一応 3.X 系でも動くはず。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.3 INSERT 構文

INSERT INTO A ( uid,name )
  SELECT B.uid, B,name FROM B LEFT JOIN A ON B.uid = A.uid WHERE A.uid IS NULL
id:isogaya

これでいったらよさげですね。試してみます。

2008/03/27 13:04:33
id:pahoo No.3

pahoo回答回数5960ベストアンサー獲得回数6332008/03/27 13:10:43

ポイント26pt

JOIN 構文を使ってできます。


1. A から、 Bにない uidのデータを削除する

DELETE A FROM A LEFT JOIN B ON A.uid=B.uid WHERE A.uid IS NOT NULL AND B.uid IS NULL;

2. A に Bにのみあるuid のデータを追加する。

INSERT INTO A(uid,name) SELECT B.* FROM A RIGHT JOIN B ON A.uid=B.uid WHERE A.uid IS NULL AND B.uid IS NOT NULL;

参考サイト

id:isogaya

なるほど

2008/03/27 13:15:05

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません