みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MySQLでWHEN句のサブクエリ中にて

MySQL ver.5.0.95です。
PHPからSQL文を作ってDBへインサートしているのですが
重複した値が合った場合はupdateするように書いています。

TBL1には
|id   |string   |count
1    aaa    0
2    bbb    3
3    ccc    1


TBL2には
|id2    |string2    |count2
1      aaa      0
2      bbb      2
3      ccc      1

実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。
このとき、TBL1のそれぞれをインサート若しくはアップデートするのに
TBL2の同一IDのものの、count2の状態によって場合分けしたく
同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが

insert into TBL1 values
(1, "aaa", 3),
(2, "bbb", 3),
(3, "ccc", 3),
(4, "ddd", 3)
on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END;

#1064 - You have an error in your SQL syntax;というエラーになって出来ません。
WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。
例えば決め撃ちで1つ1つ書くと通ります。
insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END;
insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END;
insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END;
insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END;

これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか?

あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、
変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。
まとめると速くなることはあるでしょうか?

投稿日時 - 2013-07-29 22:23:28

QNo.8197575

すぐに回答ほしいです

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

バルク処理でupdateまでやってしまうとなると一度テンポラリテーブルを
作った方がよいかも

//元データ
create table TBL1(id int not null unique key,string varchar(10),count int);
insert into TBL1 values(1,'aaa',0),(2,'bbb',3),(3,'ccc',1);
create table TBL2(id2 int not null unique key,string2 varchar(10),count2 int);
insert into TBL2 values(1,'aaa',0),(2,'bbb',2),(3,'ccc',1);

//処理
create temporary table tmp(id3 int,string3 varchar(10),count3 int);
insert into tmp values (1,'aaa',3),(2,'bbb',3),(3,'ccc',3),(4,'ddd',3);
insert into TBL1
select id3,string3,count3 from tmp
left join TBL2 on id3=id2 where count2 is null or count2<1
on duplicate key update count=count3;

//テンポラリを使わない場合はunionでデータを羅列?
insert into TBL1
select id3,string3,count3
from (select 1 as id3,'aaa' as string3,3 as count3 union select 2,'bbb',3 union select 3,'ccc',3 union select 4,'ddd',3) as list
left join TBL2 on id3=id2 where count2 is null or count2<1
on duplicate key update count=count3;

投稿日時 - 2013-07-30 10:52:20

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問