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

时间:2018-09-11 14:23:27

标签: sql sql-server count

我有两个名为OrderOrderDetail的表

订单表包含

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

3 个答案:

答案 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)

我倾向于使用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的精神。