SQL Server CTE-使用插入的输出在更新后选择
我看到过一些关于使用CTE(WITH)的帖子,我认为这些帖子可以解决我的问题,但我似乎无法使其适用于我的特定用例。我的用例是,我有一个包含一系列记录的表,我需要在对它们进行一个小的更新之后提取一些记录 i、 e。 -检索满足一系列条件的记录 -更新每个记录中的一列或多列 -返回更新的记录 我知道我可以使用以下方法返回记录的ID:SQL Server CTE-使用插入的输出在更新后选择,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我看到过一些关于使用CTE(WITH)的帖子,我认为这些帖子可以解决我的问题,但我似乎无法使其适用于我的特定用例。我的用例是,我有一个包含一系列记录的表,我需要在对它们进行一个小的更新之后提取一些记录 i、 e。 -检索满足一系列条件的记录 -更新每个记录中的一列或多列 -返回更新的记录 我知道我可以使用以下方法返回记录的ID: WITH cte AS ( SELECT TOP 1 * FROM msg WHERE guid = 'abcd' AND active = 1 O
WITH cte AS
( SELECT TOP 1 * FROM msg
WHERE guid = 'abcd'
AND active = 1
ORDER BY created DESC )
UPDATE cte SET active = 0
OUTPUT INSERTED.msg_id
WHERE guid = 'abcd'
这很好地返回了msg_id字段。我尝试将所有这些都包装在SELECT*FROM msg WHERE msg_id in()
查询中,但失败了
有人有什么建议吗?作为参考,使用SQL Server 2008 R2。只需添加所需的所有列,即可选择所需的数据<代码>插入的包含所有列,而不仅仅是写入的列。您还可以从
cte
别名输出列。例如:
CREATE TABLE #t (msg_id int)
;
WITH cte AS
( SELECT TOP 1 * FROM msg
WHERE guid = 'abcd'
AND active = 1
ORDER BY created DESC )
UPDATE cte SET active = 0
OUTPUT INSERTED.msg_id INTO #t
WHERE guid = 'abcd'
SELECT *
FROM #t
OUTPUT INSERTED.SomeOtherColumn, cte.SomeOtherColumn
只需添加所需的所有列,即可选择所需的数据<代码>插入的包含所有列,而不仅仅是写入的列。您还可以从
cte
别名输出列。例如:
OUTPUT INSERTED.SomeOtherColumn, cte.SomeOtherColumn
有语法问题吗?Msg 102,15级,状态1,第4行“cte”附近语法不正确。Msg 156,15级,状态1,第8行关键字“ORDER”附近语法不正确。(仅供参考,行号可能已关闭,我添加了一个“use”语句以确保使用了正确的数据库,并保留了您的其他新行)这有什么作用?它选择相同的数据,只是使用了一个不必要的临时表。“不必要的”临时表允许海报在需要时使用连接语法中针对其他表的ID列表;给猫剥皮的不同方法。谢谢斯图尔特,也很有帮助。希望我能选择两个答案。有语法问题吗?Msg 102,15级,状态1,第4行“cte”附近语法不正确。Msg 156,15级,状态1,第8行关键字“ORDER”附近语法不正确。(仅供参考,行号可能已关闭,我添加了一个“use”语句以确保使用了正确的数据库,并保留了您的其他新行)这有什么作用?它选择相同的数据,只是使用了一个不必要的临时表。“不必要的”临时表允许海报在需要时使用连接语法中针对其他表的ID列表;给猫剥皮的不同方法。谢谢斯图尔特,也很有帮助。希望我能选择两个答案。使用插入的输出。*准确地为我做了。使用插入的输出。*准确地为我做了。