查询连接两个表并根据另一个表的计数更新一个表

问题描述 投票:0回答:2

假设我有 2 个表 - QueuesQueuesMeta 具有以下示例数据:

队列:

队列编号 物品名称
1 铅笔
1 橡皮擦
2 铅笔
2 橡皮擦
2 标尺

QueuesMeta:

QueuesMetaId 队列编号 容量 计数匹配
1 1 2 没有
2 2 3 没有
3 1 3 没有
4 1 1 没有

我需要一个我计划在存储过程中使用的更新查询,该存储过程将 QueuesMeta 表中的 IsCountMatch 列(预填充为“否”)更新为“是”或“否” Queues 表中 QueueId 的记录数与 QueuesMeta 表中规定的容量相匹配。因此,查询运行后,QueuesMeta 表应如下所示:

QueuesMeta(更新):

QueuesMetaId 队列编号 容量 计数匹配
1 1 2
2 2 3
3 1 3 没有
4 1 1 没有

QueuesMeta 表中的 QueueId 不是唯一列。

我想出了一个看起来像这样的查询:

UPDATE QueuesMeta SET IsCountMatch = 'Yes'
    WHERE QueueId IN (
        SELECT Q.QueueId
        FROM QueuesMeta QM
        INNER JOIN Queues Q ON QM.QueueId = Q.QueueId
        WHERE QM.IsCountMatch='No'
        GROUP BY QM.QueueId, QM.Capacity
        HAVING QM.Capacity = COUNT(Q.QueueId))

但这似乎不起作用。快速检查显示,因为 QueueIdQueuesMeta 表中不是唯一的,所以

COUNT(Q.QueueId)
部分返回的计数为 6(QueuesMeta 中的 3 个条目和 Queues 中的 2 个条目)而不是仅仅 2 个。

感谢对查询的任何帮助。

sql sql-server join aggregate-functions
2个回答
1
投票

看来你有一个额外的加入

QueuesMeta
.

这种类型的事情用相关的

EXISTS
更容易做。您只是想知道
Queues
匹配的
QueueId
行数是否与
Capacity
相同。

UPDATE QM
SET IsCountMatch = 'Yes'
FROM QueuesMeta QM
WHERE EXISTS (SELECT 1
    FROM Queues Q
    WHERE QM.QueueId = Q.QueueId
    -- implicitly group by empty set
    HAVING QM.Capacity = COUNT(*)
)
  AND QM.IsCountMatch = 'No';

您还可以使用相关比较

UPDATE QM
SET IsCountMatch = 'Yes'
FROM QueuesMeta QM
WHERE QM.Capacity = (
    SELECT COUNT(*)
    FROM Queues Q
    WHERE QM.QueueId = Q.QueueId
    -- implicitly group by empty set
)
  AND QM.IsCountMatch = 'No';

db<>小提琴


1
投票

可以使用带有一组队列及其计数的

inner join
来完成:

update q
set IsCountMatch = 'Yes'
from QueuesMeta q
inner join (
  select QueueId, count(1) as count
  from Queues
  group by QueueId
) as s on s.QueueId = q.QueueId and s.count = q.Capacity

这里演示

© www.soinside.com 2019 - 2024. All rights reserved.