Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在单个CTE上运行多个SQL查询_Sql_Sql Server_Common Table Expression - Fatal编程技术网

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

在单个CTE上运行多个SQL查询,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,用例: 一个数据库表跟踪很多车辆。每辆车必须每三个月检查一次。当我列出要检查的汽车清单时,我还想更新它们的[状态]以反映这一点。这可以通过使用临时表来实现,但是如果可以这样使用,公共表表达式将执行得更快,更有意义 尝试的解决方案: SELECT语句将运行,但我找不到在后续UPDATE语句中使用CTE的方法。是否有某种方法可以使用CTE执行选择和更新,从而不必创建临时表 谢谢 我不明白。为什么要选择ID?只要做: UPDATE ci SET Status = 'Queued for ins

用例: 一个数据库表跟踪很多车辆。每辆车必须每三个月检查一次。当我列出要检查的汽车清单时,我还想更新它们的[状态]以反映这一点。这可以通过使用临时表来实现,但是如果可以这样使用,公共表表达式将执行得更快,更有意义

尝试的解决方案:

SELECT语句将运行,但我找不到在后续UPDATE语句中使用CTE的方法。是否有某种方法可以使用CTE执行选择和更新,从而不必创建临时表


谢谢

我不明白。为什么要选择ID?只要做:

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

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

通过将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子句在更新后获取列表


首先,我只是用CTE找错了方向。谢谢你让我明白过来!另外,很抱歉让您对软件进行猜测;我正在使用SSMS

使用Joe和Ryan推荐的OUTPUT子句更新表并查看受影响的记录

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

我简单地戳了戳jarlh提出的观点。对于这个实例来说,它看起来比输出的工作量要多一些,但我很高兴现在就了解它。

dbms名称请参阅CTE是一个特殊视图,可用于一个后续语句。没有什么可以改变这一点。如果您需要在CTE的结果集上运行多个语句,请将这些结果存储到SQL Server中的临时表或表变量中-如果您使用的是临时表或表变量,则不能将CTE用于多个查询。您可以创建一个临时表,并在其中存储来自CTE的数据。对于这个特定的例子,如果你在TSQL中没有提到dbms,你可以在更新中包含OUTPUT inserted.ID,这样你就可以更新ID。跳过cte,改为创建一个视图。欢迎使用so,你已经有了相同代码的答案,请阅读本文
UPDATE [dbo].[CarInventory]
SET Status = 'Queued for inspection'
OUTPUT Deleted.ID
WHERE <car requires inspection>