0

使用 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 行都将被删除。

4

2 回答 2

3
;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 运算符。

于 2013-02-13T17:43:18.400 回答
0

试试这个:

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
于 2013-02-13T17:41:39.947 回答