2012-10-31 35 views
1

为什么此CTE会给出错误消息?无法从CTE中删除 - MSG 4405

;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 View or function 't' is not updatable because the modification affects multiple base tables.

完全相同的语法同样适用于一个更新,而不是删除。

编辑:相同的语法工作如果t2不是一个基表,而是一个基于常量的cte基地。

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

+2

错误消息是相当不言自明的:你不能从两个表中删除。您的更新可能工作,因为它只影响其中一个表中的列。 –

+0

@ArronBertrand:但CTE数据只来自1个表 – jmoreno

+0

数据来自一个连接,这可能意味着在结果中存在多于一行,并且t1中具有相同的主键。 –

回答

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;