基于三列组合的计数列添加及ROW_NUMBER更新报错求助
解决SQL UPDATE中CTE关联报错(Msg 4104)的问题
你遇到的这个Msg 4104报错,核心原因是UPDATE语句里没有把目标表SourceTable和CTE TableA正确关联起来。原来的写法里,WHERE子句直接引用TableA.EntryUID,但SQL引擎找不到这个CTE和目标表的关联关系,所以无法绑定这个标识符。
修正后的更新语句
可以改用UPDATE ... FROM ... JOIN的语法,明确关联两个表的主键EntryUID:
WITH TableA AS ( SELECT ROW_NUMBER() OVER (PARTITION BY EntryDate, DocNo, Item ORDER BY EntryUID) AS x, EntryUID FROM SourceTable ) UPDATE SourceTable SET NEWCount = TableA.x FROM SourceTable INNER JOIN TableA ON SourceTable.EntryUID = TableA.EntryUID
或者也可以简化成直接更新CTE的写法(因为这个CTE是基于SourceTable的可更新视图,只要包含目标字段和主键就能直接更新):
WITH TableA AS ( SELECT ROW_NUMBER() OVER (PARTITION BY EntryDate, DocNo, Item ORDER BY EntryUID) AS x, EntryUID, NEWCount FROM SourceTable ) UPDATE TableA SET NEWCount = x
为什么原来的写法会报错?
原来的UPDATE语句结构是UPDATE SourceTable SET ... WHERE SourceTable.EntryUID = TableA.EntryUID,这里的TableA并没有被引入到UPDATE的上下文里——SQL引擎不知道TableA和SourceTable之间的关联,自然无法识别TableA.EntryUID这个字段。
而上面两种修正写法,要么通过FROM + JOIN把CTE和目标表关联起来,要么直接更新CTE,这样就能让SQL引擎正确找到关联关系,解决标识符绑定的问题。
内容的提问来源于stack exchange,提问作者Mon27ster
相关产品推荐
相关产品推荐

