2

为什么此 CTE 会给出错误消息?

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

它给出了错误信息

消息 4405,级别 16,状态 1,第 5 行视图或函数“t”不可更新,因为修改会影响多个基表。

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

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

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

4

1 回答 1

2

老问题,但这是一种使用 cte 执行此操作而不会出现多个基表错误的方法:

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

通过使用 in 比较,它会比连接慢,但它允许您拥有一个基表。此外,值得注意的是,您可以在完全不使用 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;
于 2013-12-07T06:50:57.447 回答