我想更新我的表,以便共享值(在相同列中)的行被标记为这样.
示例表定义:
CREATE TABLE `MyTable` (
`id` int NOT NULL ,
`a` varchar(10) NOT NULL ,
`b` varchar(10) NOT NULL ,
`state` tinyint NOT NULL ,
PRIMARY KEY (`id`)
) ;
Run Code Online (Sandbox Code Playgroud)
我想更新在同一列中共享值的每一行的"状态".因此,如果第一行具有"a = AAAA"而第二行具有相同的"a"值,则两者都应该更新.
我试过这个,但它太慢了(不比使用JDBC在Java中做得快):
declare mycursor cursor for select id, a, b from mytable;
open mycursor;
repeat
fetch mycursor into idid, aa, bb;
update mytable set state=1 where (a=aa, b=bb)
until done end repeat;
close mycursor;
Run Code Online (Sandbox Code Playgroud)
有什么想法让这种方式变得更好?多年来我没有做过任何体面的SQL.
尝试第一次查询以查看具有重复项的行 -
SELECT * FROM MyTable t1
JOIN (
SELECT a, b FROM MyTable
WHERE a = 'aa' AND b = 'bb' -- additional condition
GROUP BY a, b
HAVING COUNT(*) > 1) t2
ON t1.a = t2.a AND t1.b = t2.b
Run Code Online (Sandbox Code Playgroud)
试试这个(基于第一个查询)来更新status
字段 -
UPDATE MyTable t1
JOIN (
SELECT a, b FROM MyTable
WHERE a = 'aa' AND b = 'bb' -- additional condition
GROUP BY a, b
HAVING COUNT(*) > 1) t2
ON t1.a = t2.a AND t1.b = t2.b
SET t1.state = 1;
Run Code Online (Sandbox Code Playgroud)