3 回答

TA貢獻1876條經(jīng)驗 獲得超7個贊
您沒有說明您使用的是哪個版本,但在SQL 2005及更高版本中,您可以使用帶有OVER子句的公用表表達式。它有點像這樣:
WITH cte AS (
SELECT[foo], [bar],
row_number() OVER(PARTITION BY foo, bar ORDER BY baz) AS [rn]
FROM TABLE
)
DELETE cte WHERE [rn] > 1
玩弄它,看看你得到了什么。
(編輯:為了有所幫助,有人編輯了ORDER BYCTE中的條款。要清楚,你可以按照你想要的任何順序排序,它不一定是cte返回的列之一。事實上,一個常見的在這里使用情況是“富,酒吧”是組標識符和“巴茲”是某種形式的時間戳。為了保持最新,你會怎么做ORDER BY baz desc)

TA貢獻1780條經(jīng)驗 獲得超4個贊
示例查詢:
DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)
以下fields是您要對重復行進行分組的列。

TA貢獻1856條經(jīng)驗 獲得超11個贊
這是我對它的一種扭曲,有一個可運行的例子。請注意,這僅適用于唯一的情況Id,并且您在其他列中具有重復值。
DECLARE @SampleData AS TABLE (Id int, Duplicate varchar(20))
INSERT INTO @SampleData
SELECT 1, 'ABC' UNION ALL
SELECT 2, 'ABC' UNION ALL
SELECT 3, 'LMN' UNION ALL
SELECT 4, 'XYZ' UNION ALL
SELECT 5, 'XYZ'
DELETE FROM @SampleData WHERE Id IN (
SELECT Id FROM (
SELECT
Id
,ROW_NUMBER() OVER (PARTITION BY [Duplicate] ORDER BY Id) AS [ItemNumber]
-- Change the partition columns to include the ones that make the row distinct
FROM
@SampleData
) a WHERE ItemNumber > 1 -- Keep only the first unique item
)
SELECT * FROM @SampleData
結(jié)果如下:
Id Duplicate
----------- ---------
1 ABC
3 LMN
4 XYZ
不知道為什么這就是我首先想到的......絕對不是最簡單的方法,但它有效。
- 3 回答
- 0 關注
- 774 瀏覽
添加回答
舉報