繁体   English   中英

如果联接表具有2列或更多列,则更新表的字段

[英]Update field of a table if joining table has 2 or more columns

我有2个表分别命名为OrderOrderDetail

订单表包含

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

我倾向于使用INEXISTS

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM