我有两个名为Order
和OrderDetail
的表
订单表包含
OrderID -- DetailCount
1 ------------Multiple
2 ------------
订单详细信息包含
OrderID ------ Description
1 ------------------ Test1
1 ------------------ Test1
2 ------------------ Test1
如何通过统计Order
表中的记录来联接上述2个表以更新DetailCount
表的OrderDetail
。
如果OrderDetail
通过加入OrderID
而具有更多的1列,则DetailCount
的值应为'Multiple'。
我想出了以下查询。但是包含一个错误。我该怎么解决?
UPDATE o
SET o.DetailCount = 'Multiple'
FROM #Order o
INNER JOIN #OrderDetail od
ON o.OrderID = od.OrderID
WHERE COUNT(od.OrderID) > 1
答案 0 :(得分:1)
我会使用APPLY
:
UPDATE o
SET o.DetailCount = (CASE WHEN od.od_cnt > 1
THEN 'Multple'
ELSE CAST(od.od_cnt AS VARCHAR(255))
END)
FROM #Order o CROSS APPLY
( SELECT COUNT(*) AS od_cnt
FROM #OrderDetail od
WHERE od.OrderID = o.OrderID
) od;
如果您要更新仅包含一个计数的OrderID
,请添加where
子句并删除case
表达式:
UPDATE o
SET o.DetailCount = 'Multple'
FROM #Order o CROSS APPLY
( SELECT COUNT(*) AS od_cnt
FROM #OrderDetail od
WHERE od.OrderID = o.OrderID
) od
WHERE od.od_cnt > 1;
答案 1 :(得分:1)
尝试使用HAVING替代
UPDATE o
SET o.DetailCount = 'Multiple'
FROM #Order o
INNER JOIN
(
SELECT OrderID
FROM #OrderDetail
GROUP BY OrderID
HAVING COUNT(*) > 1
) x
ON o.OrderID = x.OrderID
答案 2 :(得分:1)
我倾向于使用IN
或EXISTS
:
UPDATE o
SET DetailCount = 'Multiple'
FROM #Order o
WHERE o.OrderID IN (SELECT od.OrderID
FROM #OrderDetail od
GROUP BY od.OrderID
HAVING COUNT(*) > 1
);
尽管您可以使用JOIN
来表述,但我只是认为WHERE
子句中的过滤更符合UPDATE
的精神。