【问题标题】:WITH cte UPDATE SET with WHERE breaksWITH cte UPDATE SET 与 WHERE 中断
【发布时间】:2017-06-20 22:48:45
【问题描述】:
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 子句,我似乎只能设置一个值。

我做错了什么?

谢谢, 你的

【问题讨论】:

  • 这似乎是什么问题?,这就像你想要的那样运行
  • 因为更新语句只能有一个 where 子句。在这种情况下,我认为您会想要使用 case 表达式。
  • @Lamak 他们正在谈论更新中的第二列(目前已被注释掉)。
  • @SeanLange 啊,是的,我现在明白了。答案正如你所说。它与使用 CTE 无关,所以 op 似乎很困惑
  • 添加预期结果。

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


【解决方案1】:

您需要在此处使用 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

【讨论】:

  • 好的,谢谢。感谢您的帮助:) ...很多困惑,但感谢这个论坛,它正在变得更好!
【解决方案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' ) 

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-19
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多