无法从CTE中删除 - MSG 4405

时间:2012-10-31 17:50:53

标签: sql-server-2008-r2 common-table-expression sql-delete

为什么这个CTE会给出错误信息?

;with del as (
    SELECT t1.*
    FROM t1 
          INNER JOIN t2
            ON t1.tid = t2.tid
)
DELETE del;

它给出了错误消息

  

Msg 4405,Level 16,State 1,Line 5   视图或函数't'不可更新,因为修改会影响多个基表。

完全相同的语法适用于更新,但不适用于删除。

编辑:如果t2不是基表,则相同的语法有效,而是基于常量的cte。

http://sqlfiddle.com/#!6/dcc10/2

1 个答案:

答案 0 :(得分:1)

旧问题但是这里有一种方法可以使用cte而不会出现多个基表错误:

;with del as (
    SELECT t1.*
    FROM t1
    WHERE
        t1.tid in (select t2.tid from t2)
)
DELETE del;

通过使用比较,它将比连接慢,但它允许您有一个基表。此外,值得注意的是,您可以完全不使用cte进行相同类型的删除:

DELETE FROM t1
where t1.tid in (select t2.tid from t2);

和(最佳表现):

DELETE t1
FROM t1
INNER JOIN t2
    ON T1.tid = t2.tid;