我的三张表 样式一样 
然后手动创建了视图 
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.   

    使用了:UNION ALL 的视图不能更新,您可以直接更新A表或B表中相应字段。然后再刷新一下就行!
      

  2.   


    可更新的视图
    只要满足下列条件,即可通过视图修改基础基表的数据: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 子句中的任何子查询,就像其应用于视图本身一样。通常情况下,数据库引擎必须能够明确跟踪从视图定义到一个基表的修改。有关详细信息,请参阅通过视图修改数据。
      

  3.   

    可更新视图的要求如下:视图定义必须是一个简单的SELECT语句,不能带连接、集合操作。即SELECT语句的FROM子句中不能出现多个表,也不能有 JOIN、EXCEPT、UNION、INTERSECT 
    视图定义的 SELECT子句中不能有DISTINCT 
    SELECT子句中的各列必须来自于基表(视图)的列,不能是表达式 
    视图所基于的基表(或视图)必须是可更新的 
    视图定义的 SELECT子句的子查询的FROM子句不能有视图所基于的基表(或视图) 
    视图定义的 SELECT语句中不能含有GROUP BY子句 
    视图定义的 SELECT语句中不能含有HAVING子句 
      

  4.   

    view是虚的,更新view,实际上是更新实体表(A,B,C)
    ms-sql 不支持 有聚集函数,TOP, GROUP BY, UNION,DISTINCT 等的view更新。
    在这方面DB2做的好一些,可以支持某些union 的视图更新/删除/新增如非要在ms-sql上针对union更新,
    某些需求下,可以尝试在view上建立instead of 触发器,触发器中去更新实体表。