我的三张表 样式一样
然后手动创建了视图
sql语句为SELECT * FROM A
UNION ALL
SELECT * FROM B
UNION ALL
SELECT * FROM C现在运行视图 abc
select * from abc 可以但是我更新时候爆错了 该怎么办
update abc set name=‘xsax’ where ID=2错误为:UNION ALL 视图 'csbxjj.dbo.abc不可更新,因为没有找到分区依据列。
咋整!
然后手动创建了视图
sql语句为SELECT * FROM A
UNION ALL
SELECT * FROM B
UNION ALL
SELECT * FROM C现在运行视图 abc
select * from abc 可以但是我更新时候爆错了 该怎么办
update abc set name=‘xsax’ where ID=2错误为:UNION ALL 视图 'csbxjj.dbo.abc不可更新,因为没有找到分区依据列。
咋整!
可更新的视图
只要满足下列条件,即可通过视图修改基础基表的数据:1、任何修改(包括 UPDATE、INSERT 和 DELETE 语句)都只能引用一个基表的列。2、视图中被修改的列必须直接引用表列中的基础数据。不能通过任何其他方式对这些列进行派生,如通过以下方式:
聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。3、不能从使用其他列的表达式中计算该列。使用集合运算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列将计入计算结果,且不可更新。
被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影响。
4、TOP 在视图的 select_statement 中的任何位置都不会与 WITH CHECK OPTION 子句一起使用。
上述限制适用于视图的 FROM 子句中的任何子查询,就像其应用于视图本身一样。通常情况下,数据库引擎必须能够明确跟踪从视图定义到一个基表的修改。有关详细信息,请参阅通过视图修改数据。
视图定义的 SELECT子句中不能有DISTINCT
SELECT子句中的各列必须来自于基表(视图)的列,不能是表达式
视图所基于的基表(或视图)必须是可更新的
视图定义的 SELECT子句的子查询的FROM子句不能有视图所基于的基表(或视图)
视图定义的 SELECT语句中不能含有GROUP BY子句
视图定义的 SELECT语句中不能含有HAVING子句
ms-sql 不支持 有聚集函数,TOP, GROUP BY, UNION,DISTINCT 等的view更新。
在这方面DB2做的好一些,可以支持某些union 的视图更新/删除/新增如非要在ms-sql上针对union更新,
某些需求下,可以尝试在view上建立instead of 触发器,触发器中去更新实体表。