2012-10-31 33 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;