「クエリが行を正しく更新しない」の場合:
列b
を更新します 最小まで b
の 同じa
を持つすべての行
次のJOIN
を使用することを提案しました それを行うには:
UPDATE test.tem t1
JOIN test.tem t2
ON t1.a = t2.a
SET t1.b = t2.b
WHERE t1.b > t2.b
OR t1.b IS NULL;
あなたが思うかもしれないことに反して、その JOIN
1-1 JOIN
は実行されません 。実際には、多対多の JOIN
昨日言ったように
結合句で主キー(またはnull以外の一意キー)を使用しないでください。
実際、そのクエリを SELECT
として書き直します おそらく問題を理解するのに役立ちます:
SELECT t1.a as t1a, t1.b as t1b, t2.a as t2a,t2.b as t2b FROM tem t1 JOIN tem t2
ON t1.a = t2.a
WHERE t1.b > t2.b
OR t1.b IS NULL;
+------+---------+------+--------+
| T1A | T1B | T2A | T2B |
+------+---------+------+--------+
| 1 | (null) | 1 | 2 |
| 1 | 2 | 1 | 1 |
| 1 | (null) | 1 | 1 |
| 1 | (null) | 1 | (null) |
+------+---------+------+--------+
http://sqlfiddle.com/#!2/856a7/8
ご覧のとおり、行(1、null)
(1、1)
に一致 、(1、2)コード> および
(1、null)
。クエリの(非決定論的な)実行順序に応じて、これにより、 b
に可能な3つの値のいずれかが割り当てられる可能性があります。 (それについてはよくわかりませんが、多分 それを更新することさえいくつか 時間)。ある程度まで、テスト中に「間違った」結果を見つけたのは幸運でした!
これで、クエリで期待どおりの結果が得られない理由がもう少し説明されることを願っています。マルチテーブル以降 UPDATE
ステートメントではORDERBY
は許可されていません GROUP BY
でもありません 私の場合、「良い」結果を見つけるための条項は、最小の最初のを見つける以外に多くのオプションはありません。 サブクエリを介して...