繁体   English   中英

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

[英]Running multiple SQL queries on a single CTE

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

尝试的解决方案:

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

谢谢!

我不明白 为什么选择id 做就是了:

UPDATE ci
    SET Status = 'Queued for inspection'
    FROM [dbo].[CarInventory] ci;
    WHERE <car requires inspection> ;

如果要返回受影响的id ,请使用OUTPUT子句。

通过将您要更新的表与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

您可以使用update语句的output子句在更新后获取列表。

https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017

首先,我只是通过使用CTE吠叫了错误的树。 谢谢你让我直率! 另外,很抱歉让您猜测软件; 我正在使用SSMS。

使用Joe和Ryan建议的OUTPUT子句来更新表并查看受影响的工作记录。

UPDATE [dbo].[CarInventory]
SET Status = 'Queued for inspection'
OUTPUT Deleted.ID
WHERE <car requires inspection>

我简要地戳了jarlh建议的VIEW机械师。 在这种情况下,它看起来比OUTPUT还要处理更多的工作,但是我很受鼓舞,现在开始学习所有有关它的知识。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM