视图基表中的 SQL 更新行

Posted

技术标签:

【中文标题】视图基表中的 SQL 更新行【英文标题】:SQL update row in view base tables 【发布时间】:2021-03-12 21:27:34 【问题描述】:

我有一个在 SQL Server 中的两个表之间进行联合的视图。我正在使用 INSTEAD OF UPDATE 触发器来更新基表。我编写了这段代码来更新基表中特定行上的 Column1,但出现错误:

IF UPDATE(Column1)
    BEGIN
        UPDATE BaseTable
        SET Column1 = I.Column1
        FROM inserted I INNER JOIN (SELECT * FROM Table1 UNION ALL SELECT * FROM Table2) AS BaseTable
        ON I.UniqueID = BaseTable.UniqueID
        WHERE BaseTable.UniqueID = I.UniqueID

    END

ERROR: Derived table 'Base' is not updatable because a column of the derived table is derived or constant.

【问题讨论】:

UniqueID 在两张表之间真的是独一无二的。不仅“现在使用当前数据是唯一的”,而且保证是唯一的?如果它们是身份列,那么你已经走上了疯狂的道路。 这些是在整个数据库中生成的唯一字符串。 你可能想看看Partitioned Views 【参考方案1】:

错误信息实际上很清楚。视图/子查询/CTE 可更新的要求之一是每列可以匹配到单个表中的单个列。这就是错误消息试图告诉您的内容。

您必须单独更新表格:

UPDATE t1
    SET Column1 = I.Column1
    FROM inserted I INNER JOIN
         Table1 t1
         ON I.UniqueID = t1.UniqueID;

UPDATE t2
    SET Column1 = I.Column1
    FROM inserted I INNER JOIN
         Table2 t2
         ON I.UniqueID = t2.UniqueID;

SQL Server 只允许UPDATE 语句更新一个表。

【讨论】:

在我的情况下,我不需要更新两个表,而是一个或另一个,基于哪个表包含具有指定 UniqueID 的行。我需要在两个表之一上找到 UniqueID 列与更新行的 UniqueID 列相同的行。在找到更新的行来自哪个表后,UPDATE 只需针对该表运行一次。有没有简单的方法可以做到这一点? @AwiringCameron 。 . .所以呢? (1) 只有匹配 id 的行才会被更新;如果没有匹配特定表,则不会更新该表中的行。 (2) inserted 可以包含多行,因此它可能在两个表中都有行。 我没有意识到您的解决方案可以完成所有这些事情。在我看来,无论是否匹配,两个表中的行都会得到更新。感谢您的帮助,我是 SQL 新手……很明显!

以上是关于视图基表中的 SQL 更新行的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 中视图更新可以更新基表中数据,视图更新应该满足啥条件?

SQL 视图

SQL 视图

oracle基表更新普通视图是不是更新

插入(或更新)到基表后视图是不是立即更新

具有多个基表和完整性能的 Microsoft SQL Server (MSSQL) 可更新视图