删除SQL中的重复项

  • 本文关键字:SQL 删除 sql
  • 更新时间 :
  • 英文 :


在一次面试中,我必须编写一个SQL-Query,从一个表中删除BestellNummer和Type重复项。

我不允许使用临时表,应该在一个查询中完成。

在stackoverflow上的另一个问题的帮助下,我找到了这个解决方案(T-SQL:删除所有重复的行,但保留一个):
DELETE FROM auftrag WHERE ID NOT IN
(
SELECT MIN(ID) FROM auftrag GROUP BY BestellNummer, Type
)

autrag表如下所示:

ID  BestellNummer   Type    Number   
0   123             O       1000
1   123             O       1001
2   123             E       1002
3   512             O       1003
4   512             O       1004
5   732             E       1005

查询现在删除ID 1和4,因为它们是重复的。

我的问题是,这个查询实际上是如何工作的呢?我能辨认出一些字,但我有一点困惑。

如果有人能告诉我它是如何工作的就太好了(:

GROUP BY子句根据列Bestellnummer和Type的唯一组合将数据分成几组,这里我将行与行分开以显示组:

ID  BestellNummer   Type    Number  
----------------------------------
0   123             O       1000
1   123             O       1001
----------------------------------
2   123             E       1002
----------------------------------
3   512             O       1003
4   512             O       1004
----------------------------------
5   732             E       1005

则MIN(id)简单地找到"id"的最小值。列,只留下id 0、2、3和5。

然后DELETE命令说要删除NOT IN(0, 2, 3, 5)行,从而删除第1行和第4行,使Bestellnummer和Type的每个唯一组合对应一行。

通过以下方式可以删除BestellNummer和Type的重复记录

WITH cte AS (
SELECT *, row_number() OVER(PARTITION BY [BestellNummer],[Type] ORDER BY [ID]) AS [rn] FROM auftrag 
)
DELETE cte WHERE [rn] > 1

以上查询是基于MSSQL格式化的

最新更新