Mysql
 sql >> база данни >  >> RDS >> Mysql

Вътрешни стъпки за актуализиране на MYSQL присъединяване

За „заявката не актуализира правилно редовете“:

Искате да актуализирате колона 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 клаузи, според мен, за да намеря „добрия“ резултат, не виждам много други опции освен намирането на минимума първо чрез подзаявка...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Генеалогично дърво mysql

  2. Как да направите JTable с възможност за превъртане

  3. сортиране по висока-ниска цена с mysql данни

  4. Mysql...Невъзможна заявка?

  5. Mysql репликация на един сървър