Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CTE更新SQL语句_Sql_Sql Server_Tsql_Common Table Expression - Fatal编程技术网

使用CTE更新SQL语句

使用CTE更新SQL语句,sql,sql-server,tsql,common-table-expression,Sql,Sql Server,Tsql,Common Table Expression,我有一个常用的表表达式,试图将其用作update语句。CTE的唯一原因是我可以使用where子句按CredCount进行筛选。我想使用where子句只更新与本例中CredCount为2匹配的记录。但是,我在查询的更新部分遇到了问题 成员身份证 资格证书 CredCount 成员数目 1. 心肺复苏术 2. 0 2. 心肺复苏术 2. 0 3. 心肺复苏术 2. 0 试试这个: .... CTE2 AS ( SELECT members_id FROM members ), CTE3

我有一个常用的表表达式,试图将其用作update语句。CTE的唯一原因是我可以使用where子句按CredCount进行筛选。我想使用where子句只更新与本例中CredCount为2匹配的记录。但是,我在查询的更新部分遇到了问题

成员身份证 资格证书 CredCount 成员数目 1. 心肺复苏术 2. 0 2. 心肺复苏术 2. 0 3. 心肺复苏术 2. 0 试试这个:

....
CTE2 AS ( 
   SELECT members_id
   FROM members
), CTE3 AS (
   SELECT  CTE.members_id, CTE.Credentials, CTE.CredCount,  
           CTE.members_amountdue,  
           (CTE.members_amountdue + 25) as NewPriceTotal
   FROM CTE JOIN CTE2 ON CTE.members_id = CTE2.members_id
   WHERE CTE.CredCount = 2)
UPDATE CTE3
SET members_amountdue = NewPriceTotal

该更新是一个单独的声明,不知道您对CTEs所做的任何事情。CTE类似于临时的内联视图,不会持久化。也许您应该将输出转储到#temp表,并更改UPDATE语句以加入到#temp表。感谢您的建议,但是这会遇到错误“Msg 4403,级别16,状态1,第1行无法更新视图或函数“CTE3”,因为它包含聚合、DISTINCT或GROUP BY子句、PIVOT或UNPIVOT运算符。”@这是因为顶级CTE中使用了
DISTINCT
关键字。
更新将传播到数据库中的实际表。使用
DISTINCT
使引擎很难确定要更新的确切行。如果您没有使用
DISTINCT
,结果会是什么?谢谢Giorgos-我感谢您的帮助。你的建议是对的。