sql - 使用公共(public)表表达式并执行多个更新命令

标签 sql sql-server sql-server-2008

我们是否可以使用 CTE 执行多个更新命令?

With Query AS
(
    SELECT
        Table_One.FOO AS FOO,
        Table_Two.BAR AS BAR
    FROM FOO
    JOIN BAR ON FOO.ID = BAR.ID
)
UPDATE
    Query.FOO = 1;
UPDATE
    Query.BAR = 2;

在示例中,第二个 UPDATE 命令中的查询不再可用。

编辑:

我的工作代码如下所示:

With Query AS
(
    SELECT
        Table_One.FOO AS FOO,
        Table_Two.BAR AS BAR
    FROM FOO
    JOIN BAR ON FOO.ID = BAR.ID
)
UPDATE
    Query.FOO = 1

With Query AS
(
    SELECT
        Table_One.FOO AS FOO,
        Table_Two.BAR AS BAR
    FROM FOO
    JOIN BAR ON FOO.ID = BAR.ID
)
UPDATE
    Query.BAR = 2;

因为您无法使用一个 UPDATE 命令更新两个表,所以我需要两个 Update 命令。 正确知道的问题是,如果我需要更改 CTE 中的选择,我必须在代码中的两个位置执行此操作。

最佳答案

SQL Server UPDATE 只允许您更新单个表。正如埋在documentation :

The following example updates rows in a table by specifying a view as the target object. The view definition references multiple tables, however, the UPDATE statement succeeds because it references columns from only one of the underlying tables. The UPDATE statement would fail if columns from both tables were specified.

尽管 View 和 CTE 并不完全相同,但它们通常遵循相似的规则。因此,updatable views 部分也对此进行了解释。 :

Any modifications, including UPDATE, INSERT, and DELETE statements, must reference columns from only one base table.

您可以通过发出两个更新并将它们包装在单个事务中来有效地完成您想要的操作。

关于sql - 使用公共(public)表表达式并执行多个更新命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36153432/

相关文章:

sql-server - SQL SYNONYM 和性能

php - 在不求助于 mysql_insert_id() 的情况下,在单个查询中将 SQL 关系插入到 2 个表

mysql - 按计数分组可能吗?

sql-server - 启用 xp_cmdshell 不起作用

c# - 如何减少远程 SQL Server 负载?

sql-server - 使用 Case When Exists 子句进行更新

sql - 不使用 CTE 的父子层次结构路径

sql - VBA:将片段从 VBA 转换为 SQL

SQL Server 2008 - 如果不存在则插入其他更新

sql-server - SQL Server 空间查找剩余距离