在一次面试中,我必须编写一个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格式化的