更新CTE表会导致派生或常量字段失败

时间:2014-02-18 23:46:54

标签: tsql

我正在使用MS-SQL 2012

WITH C1
(
   SELECT ID, 0 as Match, Field2, Count(*)
   FROM TableX
   GROUP BY ID, Fields2
)

UPDATE C1 SET Match = 1 
WHERE ID = (SELECT MATCHING_ID FROM AnotherTable WHERE ID = C1.ID)

此TSQL语句给出了以下错误:

  
    

更新或插入视图或函数'C1'失败,因为它包含派生或常量字段。

  

理想情况下,我想创建一个名为Match的“假字段”,并将其默认值设置为0.然后,通过更新,我只想更新“AnotherTable”上有现有条目的记录。

有什么想法我做错了什么? 谢谢你提前。

2 个答案:

答案 0 :(得分:1)

尝试执行左外连接,如

   SELECT x.ID, ISNULL(a.Matching_ID, 0) as Match, x.Field2, Count(*)
   FROM TableX x
         LEFT OUTER JOIN AnotherTable a on x.ID = a.ID
   GROUP BY x.ID, ISNULL(a.Matching_ID, 0), x.Fields2

无需C1

答案 1 :(得分:1)

如果我理解正确,问题是您正在尝试更新CTE表。如果你直接更新表,你应该没问题。

此修改版本有帮助吗?

SELECT t.ID
, CASE WHEN (EXISTS (SELECT MATCHING_ID FROM AnotherTable WHERE ID = t.ID)) THEN 1 ELSE 0 END
,t.Field2
,Count(*)
FROM TableX t
GROUP BY ID, Fields2