これを行う別の可能な方法は
;
--Ensure that any immediately preceding statement is terminated with a semicolon above
WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3
ORDER BY ( SELECT 0)) RN
FROM #MyTable)
DELETE FROM cte
WHERE RN > 1;
使っています ORDER BY (SELECT 0)
タイの場合にどの行を保存するかは任意なので上記をています。
RowID
例えばあなたが使用できるように最新のものを保存するにはORDER BY RowID DESC
実行計画
これの実行計画は、自己結合を必要としないため、受け入れられた回答よりも単純で効率的であることがよくあります。
ただし、常にそうであるとは限りません。GROUP BY
ソリューションが推奨される1つの場所は、ハッシュ集計ストリーム集約よりもが選択されるです。
ROW_NUMBER
一方、解決策は、常にほとんど同じプランを与えるGROUP BY
戦略がより柔軟です。
ハッシュ集約アプローチを支持する可能性のある要因は、
- パーティション化列に有用なインデックスはありません
- 比較的少ないグループで、各グループの複製が比較的多い
この2番目のケースの極端なバージョン(各グループに重複が多いグループが非常に少ない場合)では、新しいテーブルに保持する行を挿入してからTRUNCATE
、元のテーブルをコピーしてコピーし戻すことで、削除と比較してロギングを最小限に抑えることもできます。行の非常に高い割合。
DELETE FROM
、CTE用語を直接使用することはできません。stackoverflow.com/q/18439054/398670を