在CASE语句中返回多个结果时,仅更新行值一次

时间:2014-07-04 13:59:34

标签: sql-server case

我需要使用CASE WHEN语句返回的值运行UPDATE脚本。使用的条件可能导致具有不同的erorrs所指示的相同顺序(表ORDER)。
例如,order.id = 20可能会受到错误1和错误2的影响,但是我只需要使用值Error 1更新它(CASE WHEN中的顺序显示优先级)。

目标是只在字段STATUS中设置错误1。这可能在TSQL中实现吗?或者我应该用控制台应用程序更好地实现逻辑? 感谢。

UPDATE O
SET STATUS = (  
CASE
    WHEN E.EXPID = 'E1' THEN 'Error1' 
    WHEN E.EXPID = 'E3' THEN 'Error2'
    WHEN E.EXPID = 'E2' THEN 'Error3'
    ELSE 'EX'
END )
FROM ORDER O 
INNER JOIN EXCP E ON O.ID = E.ORDERID

1 个答案:

答案 0 :(得分:1)

我会使用CTE来获取您的订单表中的顶部“错误”和join

;WITH TopError 
AS 
(
    SELECT ROW_NUMBER() OVER(PARTITION BY OrderID ORDER BY ExpID ASC) AS ROWID, *
    FROM Excp
)

SELECT * 
-- UPDATE O SET STATUS = CASE WHEN T.EXPID = 'E1' THEN 'Error1' WHEN T.EXPID = 'E2' THEN 'Error2' WHEN T.EXPID = 'E3' THEN 'Error3' ELSE 'EX' END
FROM TopError T
JOIN Order O
  ON T.ORDERID = O.ID
WHERE T.ROWID=1

尝试SELECT,如果您对结果感到满意,请切换为UPDATE