用例: 数据库表跟踪很多汽车。每辆汽车必须每三个月检查一次。当我列出要检查的汽车清单时,我也想更新其[状态]以反映这一点。这可以通过使用临时表来完成,但是公用表表达式的执行速度更快,并且如果可以通过这种方式使用,则更有意义。
尝试的解决方案:
WITH CTE AS (
SELECT ID
FROM [dbo].[CarInventory]
WHERE <car requires inspection> )
SELECT ID
FROM CTE;
UPDATE [dbo].[CarInventory]
SET Status = 'Queued for inspection'
WHERE ID IN (SELECT ID FROM CTE);
SELECT语句将运行,但是我找不到在后续UPDATE语句中使用CTE的方法。有什么方法可以使用CTE执行SELECT和UPDATE,所以我不必创建临时表?
谢谢!
答案 0 :(得分:1)
我不明白。为什么选择id
?只要做:
UPDATE ci
SET Status = 'Queued for inspection'
FROM [dbo].[CarInventory] ci;
WHERE <car requires inspection> ;
如果要返回受影响的id
,请使用OUTPUT
子句。
答案 1 :(得分:0)
通过内部联接CTE与要更新的表,您将仅更新那些联接的记录。
WITH CTE AS
(
SELECT ID
FROM [dbo].[CarInventory]
WHERE <car requires inspection>
)
UPDATE [dbo].[CarInventory]
SET Status = 'Queued for inspection'
OUTPut CTE.*
FROM [dbo].[CarInventory]
INNER JOIN CTE ON [dbo].[CarInventory].ID = cte.ID
答案 2 :(得分:0)
您可以使用update语句的输出子句在更新后获取列表。
https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017
答案 3 :(得分:0)
首先,我只是通过使用CTE吠叫了错误的树。谢谢你让我直率!另外,很抱歉让您猜测软件;我正在使用SSMS。
使用Joe和Ryan建议的OUTPUT子句来更新表并查看受影响的工作记录。
UPDATE [dbo].[CarInventory]
SET Status = 'Queued for inspection'
OUTPUT Deleted.ID
WHERE <car requires inspection>
我简要地戳了jarlh建议的VIEW机制。在这种情况下,它看起来比OUTPUT还要处理更多的工作,但是现在我很高兴学习所有有关此内容的信息。