【发布时间】:2019-02-08 13:40:09
【问题描述】:
我有一个 CTE,它基本上根据某些标准过滤数据,问题是过滤后我需要更新这些记录以“更正”它们,但我在 UPDATE 语句上得到一个 4104。
当我直接调用变量时,我没有问题,但是在我进行计算的地方我得到一个错误,因为我从第一个和第二个查询中调用变量。
;WITH CTE AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY timestmp ASC) order,
*
FROM TSTSOLAP T
(
--SECOND QUERY
SELECT 1 FROM TABLE1 T2
WHERE --CONDITIONS MET
t.user_id = t2.id_user AND
T.ID_TIP = T2.ID_TIP AND
T.ID <> t2.ID AND
(T2.BEG BETWEEN T.BEG AND T.END)
OR T2.BEG = T.END
)
)
UPDATE CTE SET STAT=0, END = (T2.END - 1) --HERE IS WHERE I GET THE: Msg 4104, Level 16, State 1, Line 1
WHERE ORDER> 1
GO
如何调用非链接变量?
*代码因长度而缩短
【问题讨论】:
-
您无法从外部访问子查询。
CONDITIONS MET是什么?您需要加入表格以获取此信息。 -
您需要在 CTE 结果中公开
END列,以便使用WHERE子句中的值。因此,您需要使用联接或标量子查询而不是EXISTS并将END列添加到结果中。或者。将条件移至 CTE。 -
@Rango 条件是users_id匹配,type_id匹配,record_id不同,日期不同。
-
更新语句无效。没有参考 CTE 公开的表 T2。唯一可以引用的列是表 1 中的列。
-
@Kurox:如果
Table2中的多行符合此条件怎么办?你想用什么T2.End来更新Table1?逻辑根本不清楚。
标签: sql sql-server sql-update common-table-expression