我正在尝试将下面的2个Update语句合并到一个查询中,因为它们都在同一个表上工作。
我的学校。现状计数根据孩子的数量更新。出勤=现状
UPDATE school s SET s.present=(SELECT count(children.id) FROM children c
WHERE c.school_id =s._id AND c.attendance='PRESENT')
同样,school.danced计数根据children.activity = DANCE状态
更新UPDATE school s SET s.danced=(SELECT count(children.id) FROM children c
WHERE c.school_id =s._id AND c.activity='DANCE')
是否可以将两者合并以节省查询数量?
我目前的尝试是将两者合并为以下内容 - 但我认为这将导致与上述相同的两个查询
UPDATE school s SET
s.danced=(SELECT count(children.id) FROM children c
WHERE c.school_id =s._id AND c.activity='DANCE'),
s.present=(SELECT count(children.id) FROM children c
WHERE c.school_id =s._id AND c.attendance='PRESENT')
有没有更好的方法来实现这一目标,还是上述效率最高?
答案 0 :(得分:1)
使用包含两个聚合的更新联接:
UPDATE school s
INNER JOIN
(
SELECT
school_id,
COUNT(CASE WHEN attendance = 'PRESENT' THEN 1 END) AS p_cnt,
COUNT(CASE WHEN attendance = 'DANCE' THEN 1 END) AS d_cnt
FROM children
GROUP BY school_id
) c
ON s._id = c.school_id
SET
present = c.p_cnt,
danced = c.d_cnt;