За „заявката не актуализира правилно редовете“:
Искате да актуализирате колона 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
тъй като както казах вчера
не използвате първичен ключ (нито ненулев уникален ключ) във вашата клауза за присъединяване.
Всъщност пренаписване на тази заявка като 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
(не съм сигурен в това, но може би дори го актуализира няколко пъти). До известна степен сте имали късмета да откриете "грешен" резултат по време на тестване!
Надявам се това да обясни малко повече защо вашата заявка не дава очаквания резултат. Тъй като много таблици UPDATE
изразите не позволяват ORDER BY
нито GROUP BY
клаузи, според мен, за да намеря „добрия“ резултат, не виждам много други опции освен намирането на минимума първо чрез подзаявка...