我在MYSQL中有一张表:
CREATE TABLE test.tem(a INT,b INT);
以下是数据:
INSERT INTO test.tem VALUES(1,2),(1,1),(1,NULL),(2,3);
现在数据应该是这样的:
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 1 | 1 |
| 1 | NULL |
| 2 | 3 |
+------+------+
我希望更新B列的数据为A列分组后B列的最小值。
所以SQL语句应该是:
UPDATE test.tem o
SET o.b = (SELECT
MIN(b)
FROM test.tem i
WHERE i.a = o.a)
但是MYSQL不支持在FROM子句中指定目标表进行更新操作。
因此,我认为以下SQL可以高效地解决我的问题:
UPDATE test.tem t1
JOIN test.tem t2
ON t1.a = t2.a
SET t1.b = t2.b
WHERE t1.b IS NULL
OR t1.b > t2.b;
但结果是:
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
+------+------+
实际上我需要的结果是:
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 2 | 3 |
+------+------+
问题1:为什么MYSQL在执行SQL时会得出错误的结果?正确且高效的SQL应该是什么?
问题2:如果我只想将b更新为NULL值(仅更新第三条记录),应该使用什么SQL?
关于问题2,我尝试使用了下面的不正确的SQL:
UPDATE test.tem t1
JOIN test.tem t2
ON t1.a = t2.a
AND t1.b IS NULL
SET t1.b = t2.b
WHERE t1.b IS NULL
OR t1.b > t2.b;