Ich versuche, eine Aktualisierungsabfrage zu erstellen und mache nur geringe Fortschritte bei der richtigen Syntax. Die folgende Abfrage funktioniert:
SELECT t.Index1, t.Index2, COUNT( m.EventType )
FROM Table t
LEFT JOIN MEvents m ON
(m.Index1 = t.Index1 AND
m.Index2 = t.Index2 AND
(m.EventType = 'A' OR m.EventType = 'B')
)
WHERE (t.SpecialEventCount IS NULL)
GROUP BY t.Index1, t.Index2
Es wird eine Liste von Triplets Index1, Index2, EventCounts erstellt. Dies geschieht nur für den Fall, dass t.SpecialEventCount NULL ist. Die Aktualisierungsabfrage, die ich zu schreiben versuche, sollte diesen SpecialEventCount auf diesen Zähler setzen, d. H. COUNT (m.EventType) in der obigen Abfrage. Diese Zahl kann 0 oder eine beliebige positive Zahl sein (daher der linke Join). Index1 und Index2 sind in Tabelle t zusammen eindeutig und werden zum Identifizieren von Ereignissen in MEvent verwendet.
Wie muss ich die Auswahlabfrage ändern, um eine Aktualisierungsabfrage zu werden? Das heißt etwas wie
UPDATE Table SET SpecialEventCount=COUNT(m.EventType).....
aber ich bin verwirrt, was ich wo hinstellen soll und habe mit zahlreichen unterschiedlichen Vermutungen versagt.
Ich gehe davon aus, dass (Index1, Index2)
Ein eindeutiger Schlüssel für Table
ist, andernfalls würde ich erwarten, dass der Verweis auf t.SpecialEventCount
Zu einem Fehler führt.
Die Abfrage wurde bearbeitet, um die Unterabfrage zu verwenden, da sie mit GROUP BY
Nicht funktioniert hat.
UPDATE
Table AS t
LEFT JOIN (
SELECT
Index1,
Index2,
COUNT(EventType) AS NumEvents
FROM
MEvents
WHERE
EventType = 'A' OR EventType = 'B'
GROUP BY
Index1,
Index2
) AS m ON
m.Index1 = t.Index1 AND
m.Index2 = t.Index2
SET
t.SpecialEventCount = m.NumEvents
WHERE
t.SpecialEventCount IS NULL
Wenn Sie mit einer Unterabfrage einen Link-Join ausführen, wird eine riesige temporäre Tabelle im Arbeitsspeicher generiert, die keine Indizes enthält.
Versuchen Sie bei Aktualisierungen, Verknüpfungen zu vermeiden und stattdessen korrelierte Unterabfragen zu verwenden:
UPDATE
Table AS t
SET
t.SpecialEventCount = (
SELECT COUNT(m.EventType)
FROM MEvents m
WHERE m.EventType in ('A','B')
AND m.Index1 = t.Index1
AND m.Index2 = t.Index2
)
WHERE
t.SpecialEventCount IS NULL
Führen Sie eine Profilerstellung durch, die jedoch in einigen Fällen erheblich schneller sein kann.
mein beispiel
update card_crowd as cardCrowd
LEFT JOIN
(
select cc.id , count(1) as num
from card_crowd cc LEFT JOIN
card_crowd_r ccr on cc.id = ccr.crowd_id
group by cc.id
) as tt
on cardCrowd.id = tt.id
set cardCrowd.join_num = tt.num;