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 より前のバージョンの場合、次の 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' を更新できません。

于 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 に答える