sql >> Database >  >> RDS >> Mysql

MYSQL join update interne stappen

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...



  1. Oracle selecteer wederzijdse subtekenreeks

  2. RANGE PRECEDING wordt alleen ondersteund met UNBOUNDED

  3. Wil je MySql-limiet op elke waar-voorwaarde zetten?

  4. MySQL zoeken in volledige tekst met gedeeltelijke woorden