[英]SQL Server - Update columns with CASE based on inner join when table I'm joining on has many more rows than table I'm updating
[英]Update field of a table if joining table has 2 or more columns
我有2个表分别命名为Order
和OrderDetail
订单表包含
OrderID -- DetailCount
1 ------------Multiple
2 ------------
订单明细包含
OrderID ------ Description
1 ------------------ Test1
1 ------------------ Test1
2 ------------------ Test1
如何通过计算OrderDetail
表中的记录来连接上述2个表以更新Order
表的DetailCount
。 如果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
我会使用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;
使用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
我倾向于使用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
的精神。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.