假设我有 2 个表 - Queues 和 QueuesMeta 具有以下示例数据:
队列:
队列编号 | 物品名称 |
---|---|
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))
但这似乎不起作用。快速检查显示,因为 QueueId 在 QueuesMeta 表中不是唯一的,所以
COUNT(Q.QueueId)
部分返回的计数为 6(QueuesMeta 中的 3 个条目和 Queues 中的 2 个条目)而不是仅仅 2 个。
感谢对查询的任何帮助。
看来你有一个额外的加入
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';
可以使用带有一组队列及其计数的
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