2016-12-23 16 views
1

重複したレコードを削除するには、スタックオーバーフローで以下のクエリを見つけました。このクエリでは、 "a"からレコードを削除しますが、tblEmployeeからレコードを削除していません。 uniqueまたはprimaryキーはありませんが、物理テーブルから物理的に削除されます。CTEと物理的にテーブルからレコードを削除する

WITH a as (
    SELECT Firstname,ROW_NUMBER() OVER(PARTITION by Firstname, empID ORDER BY Firstname) 
    AS duplicateRecCount 
    FROM dbo.tblEmployee 
    ) 
    --Now Delete Duplicate Records 
DELETE 
FROM a 
WHERE duplicateRecCount > 1 
+0

ご使用のデータベースで質問にタグを付けてください。 –

答えて

1

SQL Serverで更新可能なCTEを使用しているようです。この場合、CTEはビューと同じように動作します。

ビューは、1つのテーブルのみを参照し、集計を持たないため、更新可能です。したがって、CTEの効果は、テーブルに列を追加することに過ぎず、テーブルはDELETEステートメントで参照することができます。

更新可能なビューの条件については、documentationで説明しています。これらの条件はCTEの場合と同じです。

1

ここでは、一時表とCTEの違いの1つを考えてみましょう。

一時テーブルを使用する場合、この一時テーブルはTempdbデータベースに保存されます。したがって、それはあなたのテーブルtblEmployeeの単なるコピーです。テンポラリテーブルにどのような変更を加えても、tblEmployeeには影響しません。

しかし、cteを使用すると、実際には同じテーブル自体を指しています。したがって、cteから削除すると、tblEmployeeにも影響します。 CTEは使い捨てビューに過ぎません。