使用 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 之前的版本,这是一种变体:
;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
无法更新视图或函数“d”,因为它包含聚合、DISTINCT 或 GROUP BY 子句、PIVOT 或 UNPIVOT 运算符。
试试这个:
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