关联两表更新:基于Queues计数更新QueuesMeta的IsCountMatch字段
修正后的UPDATE查询方案
你的问题出在直接关联QueuesMeta和Queues表时产生了笛卡尔积,导致计数错误。因为QueuesMeta中同一个QueueId对应多条记录,关联Queues后会重复计算该QueueId的条目数,最终得到错误的统计值。
正确的做法是先单独统计每个QueueId在Queues表中的真实记录数,再将这个统计结果与QueuesMeta关联进行更新:
UPDATE QM SET IsCountMatch = CASE WHEN Q.ItemCount = QM.Capacity THEN 'Yes' ELSE 'No' END FROM QueuesMeta QM INNER JOIN ( -- 先统计每个QueueId的实际条目数 SELECT QueueId, COUNT(*) AS ItemCount FROM Queues GROUP BY QueueId ) Q ON QM.QueueId = Q.QueueId WHERE QM.IsCountMatch = 'No'; -- 只更新预填为No的记录
方案说明
- 子查询
(SELECT QueueId, COUNT(*) AS ItemCount FROM Queues GROUP BY QueueId)会先计算出每个QueueId对应的真实条目数(比如QueueId=1对应2,QueueId=2对应3)。 - 将这个统计结果与
QueuesMeta关联,每条QueuesMeta记录都能匹配到对应QueueId的真实条目数,避免了笛卡尔积导致的重复计数。 - 通过
CASE WHEN判断Capacity是否与真实条目数匹配,动态设置IsCountMatch为Yes或No。
验证结果
执行上述语句后,QueuesMeta表会被更新为你期望的结果:
| QueuesMetaId | QueueId | Capacity | IsCountMatch |
|---|---|---|---|
| 1 | 1 | 2 | Yes |
| 2 | 2 | 3 | Yes |
| 3 | 1 | 3 | No |
| 4 | 1 | 1 | No |
内容的提问来源于stack exchange,提问作者Roopak
相关产品推荐
相关产品推荐

