WITH cte UPDATE SET with WHERE breaks

Thys Coetzee
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句を導入するとすぐに、設定できる値は1つだけのようです。

私は何が間違っているのですか?

ありがとう、Thys

ショーン・ランゲ

ここでは、where句ではなくcase式を使用する必要があります。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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事