为什么这个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。
答案 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;