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;

比較を使用すると、結合よりも遅くなりますが、単一のベース テーブルを持つことができます。また、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 に答える