视图基表中的 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 更新行的主要内容,如果未能解决你的问题,请参考以下文章