使用带有WHERE中断的cte UPDATE SET

时间:2017-02-03 14:21:27

标签: sql-server sql-update common-table-expression

IF OBJECT_ID('tempdb..#TempList') IS NOT NULL
    DROP TABLE #TempList

CREATE TABLE #TempList (
    VarName NVARCHAR(10) ,
    VarValue NVARCHAR(10),
    VarValueNext NVARCHAR(10)
)
INSERT INTO #TempList 
    VALUES ('Fred',NULL, NULL), 
           ('Wilma',NULL, NULL), 
           ('Barney',NULL, NULL), 
           ('Betty',NULL, NULL)

;WITH cte_name AS (
SELECT * 
    FROM #TempList
)

UPDATE cte_name
    SET cte_name.VarValue = 'Fred' WHERE cte_name.VarName = 'Wilma' OR cte_name.VarName = 'Barney'
--      , cte_name.VarValueNext = 'Pebbles' WHERE cte_name.VarValue = 'Fred' and cte_name.VarName = 'Wilma'

SELECT * 
    FROM #TempList

我知道这是一个不保证使用CTE结构的简单示例。我试图了解UPDATE块是如何受到影响的。

我想设置多个字段的值。一旦我引入WHERE子句,看起来我只能设置一个值。

我做错了什么?

谢谢, 蒂斯

3 个答案:

答案 0 :(得分:3)

您需要在这里使用case表达式而不是where子句。请记住,where子句会过滤查询中的行。我觉得你对那里的语法有点困惑。以下是此类更新的外观。

UPDATE cte_name
    SET VarValue = case when VarName IN('Wilma', 'Barney') then 'Fred' else VarName end
      , VarValueNext = case when VarValue IN('Wilma', 'Barney') then 'Pebbles' else VarValueNext end

答案 1 :(得分:2)

如果没有错,你需要这样的东西

UPDATE #TempList
SET    VarValue = CASE
                    WHEN VarName IN ( 'Wilma', 'Barney' ) THEN 'Fred'
                    ELSE VarValue
                  END,
       VarValueNext = CASE
                        WHEN VarValue IN ( 'Fred', 'Wilma' ) THEN 'Pebbles'
                        ELSE VarValueNext
                      END
WHERE  VarName IN ( 'Wilma', 'Barney' )
        OR VarValue IN ( 'Fred', 'Wilma' ) 

答案 2 :(得分:0)

Sean Lange指出我的错误 - 每个UPDATE一个WHERE子句,而不是每个SET。

为了完整起见,这是一个有效的解决方案。

感谢所有人的帮助 - 非常感谢。有些日子......; - )

IF OBJECT_ID('tempdb..#TempList') IS NOT NULL
    DROP TABLE #TempList

CREATE TABLE #TempList (
    VarName NVARCHAR(10) ,
    VarValue NVARCHAR(10),
    VarValueNext NVARCHAR(10)
)
INSERT INTO #TempList 
    VALUES ('Fred',NULL, NULL), 
           ('Wilma',NULL, NULL), 
           ('Barney',NULL, NULL), 
           ('Betty',NULL, NULL)

;WITH cte_name AS (
SELECT * 
    FROM #TempList
)

UPDATE cte_name
    SET cte_name.VarValue = 
                CASE
                    WHEN cte_name.VarName = 'Wilma' OR cte_name.VarName = 'Barney' 
                    THEN 'Fred'
                END 
        , cte_name.VarValueNext = 
                CASE
                    WHEN cte_name.VarName = 'Betty' OR cte_name.VarName = 'Wilma'
                    THEN 'Bosses'
                END 
SELECT * 
    FROM #TempList