数据库报错:派生表‘a’不可更新,因为派生表中的某一列是派生的或是常量

我们在对数据表进行update,delete等DML操作时,如果数据库版本过低,例如sql server 2008以下,可能会出现这个报错问题:派生表‘a’不可更新,因为派生表中的某一列是派生的或是常量。

这个报错是因为数据库系统版本过低,不支持派生表操作,派生表就是由查询的结果集生成的表,可以简单理解为视图,而不是真正意义上的事实表,如下例:

update a set a.col1 = 0 from 
  (select * from (
    (select * from t1) a1
    left outer join
    (select * from t2) a2
    on a1.col1 = a2.col1 )) a

这里面的 (select * from t1) 就是派生表,上面的这个sql就是会报错的,我们想要运行,就必须舍弃派生表,用事实表来操作,如上可改为

update a1 set a1.col1 = 0 from 
    t1 a1   --这里的对象一定不能是派生表
    left outer join
    (select * from t2) a2
    on a1.col1 = a2.col1 

 

当然这个报错只会在低版本数据库系统里出现,高版本无需注意该操作,派生表更加简单明了,逻辑清晰

你可能感兴趣的:(sql)