Voor de "query die de rijen niet correct bijwerkt":
U wilt kolom b
. bijwerken tot het minimum van b
voor alle rijen met dezelfde a
Je hebt voorgesteld om de volgende JOIN
te gebruiken om dat te doen:
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;
In tegenstelling tot wat je misschien denkt, is dat JOIN
zal geen 1-1 JOIN
uitvoeren . Het is in feite een veel-op-veel JOIN
sinds zoals ik gisteren zei
je gebruikt geen primaire sleutel (noch niet-null unieke sleutel) in je join-clausule.
In feite herschrijft u die query als SELECT
zal u waarschijnlijk helpen het probleem te begrijpen:
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
Zoals je nu zult zien, is de rij (1, null)
overeenkomen met (1, 1)
, (1, 2)
en (1, null)
. Afhankelijk van de (niet-deterministische) volgorde van uitvoering van de query, kan dit een van de drie mogelijke waarden toewijzen voor b
(ben daar niet zeker van, maar misschien zelfs bijwerken meerdere keer). Tot op zekere hoogte heb je geluk gehad om het "verkeerde" resultaat te vinden tijdens het testen!
Ik hoop dat dit een beetje meer uitlegt waarom uw zoekopdracht niet het verwachte resultaat oplevert. Sinds multi-table UPDATE
verklaringen staan ORDER BY
niet toe noch GROUP BY
clausules, als van mezelf, om het "goede" resultaat te vinden, zie ik niet veel andere opties dan het minimum eerst vinden via een subquery...