在单个CTE上运行多个SQL查询

时间:2019-03-19 13:47:13

标签: sql sql-server common-table-expression

用例: 数据库表跟踪很多汽车。每辆汽车必须每三个月检查一次。当我列出要检查的汽车清单时,我也想更新其[状态]以反映这一点。这可以通过使用临时表来完成,但是公用表表达式的执行速度更快,并且如果可以通过这种方式使用,则更有意义。

尝试的解决方案:

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,所以我不必创建临时表?

谢谢!

4 个答案:

答案 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还要处理更多的工作,但是现在我很高兴学习所有有关此内容的信息。