SQL Server 2008 tsql を使用して、一連の値が繰り返されるときにテーブル内のすべてのレコードを削除しようとしています。したがって、私のテーブルが次のようになっているとします。
idcol1col2
1 A 1
2 A 1
3 A 2
4 B 1
5 B 1
6 B 2
行 1、2、4、5 はすべて削除されます。
SQL Server 2008 tsql を使用して、一連の値が繰り返されるときにテーブル内のすべてのレコードを削除しようとしています。したがって、私のテーブルが次のようになっているとします。
idcol1col2
1 A 1
2 A 1
3 A 2
4 B 1
5 B 1
6 B 2
行 1、2、4、5 はすべて削除されます。
;WITH d AS
(
SELECT col1, col2, c = COUNT(*) OVER
(PARTITION BY col1, col2 ORDER BY col1)
FROM dbo.yourtable
)
DELETE d WHERE c > 1;
実際には、もう少し整然としたものになる可能性があります。
;WITH d AS
(
SELECT id, c = COUNT(*) OVER
(PARTITION BY col1, col2 ORDER BY col1)
FROM dbo.yourtable
)
DELETE d WHERE c > 1;
SQL Server 2012 で上記をテストしましたが、フィドルを SQL Server 2008 に変更するのを忘れていました。SQL Server 2012 より前のバージョンの場合、次の 1 つのバリエーションがあります。
;WITH d AS
(
SELECT col1, col2
FROM dbo.yourtable AS t
GROUP BY col1, col2
HAVING COUNT(*) > 1
)
DELETE t --*
FROM dbo.yourtable AS t
WHERE EXISTS
(
SELECT 1 FROM d
WHERE col1 = t.col1 AND col2 = t.col2
);
DELETE d;
ここだけで十分だと思うかもしれませんが、次のようになります。メッセージ 4403、レベル 16、状態 1、行 2
集計、DISTINCT または GROUP BY 句、または PIVOT または UNPIVOT 演算子が含まれているため、ビューまたは関数 'd' を更新できません。
これを試して:
DELETE t
FROM dbo.yourTabe t
JOIN (
SELECT col1,col2,COUNT(1) cnt
FROM dbo.YourTable
GROUP BY col1, col2
HAVING COUNT(1)>1
) s
ON t.col1 = s.col1
AND t.col2 = s.col2