我正在尝试创建更新查询,并且在获取正确的语法方面进展甚微。 以下查询正在运行:
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
它会创建三元组列表Index1,Index2,EventCounts。 它仅在t.SpecialEventCount为NULL的情况下执行此操作。我试图写的更新查询应该将此SpecialEventCount设置为该计数,即上面查询中的COUNT(m.EventType)。此数字可以是0或任何正数(因此左连接)。 Index1和Index2在表t中是唯一的,它们用于识别MEvent中的事件。
如何修改select查询以成为更新查询?即
之类的东西UPDATE Table SET SpecialEventCount=COUNT(m.EventType).....
但我感到困惑的是放在哪里,并且失败了许多不同的猜测。
答案 0 :(得分:79)
我认为(Index1, Index2)
是Table
上的唯一键,否则我希望引用t.SpecialEventCount
会导致错误。
使用子查询编辑查询,因为它使用GROUP BY
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
答案 1 :(得分:4)
使用子查询执行左连接将生成一个巨型 内存中没有索引的临时表。
对于更新,请尝试避免连接并使用相关 而是子查询:
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
进行一些分析,但在某些情况下这可能会明显加快。
答案 2 :(得分:1)
我的例子
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;