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 ごとに min(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 値で更新する (3 番目のレコードのみを更新する) 場合、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;