3 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
您沒有說明您使用的是哪個(gè)版本,但在SQL 2005及更高版本中,您可以使用帶有OVER子句的公用表表達(dá)式。它有點(diǎn)像這樣:
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返回的列之一。事實(shí)上,一個(gè)常見的在這里使用情況是“富,酒吧”是組標(biāo)識(shí)符和“巴茲”是某種形式的時(shí)間戳。為了保持最新,你會(huì)怎么做ORDER BY baz desc)

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

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
這是我對(duì)它的一種扭曲,有一個(gè)可運(yùn)行的例子。請(qǐng)注意,這僅適用于唯一的情況Id,并且您在其他列中具有重復(fù)值。
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
不知道為什么這就是我首先想到的......絕對(duì)不是最簡單的方法,但它有效。
- 3 回答
- 0 關(guān)注
- 759 瀏覽
添加回答
舉報(bào)