我有一个表,其中可以使用 ORDER 和 ITEM 的串联来识别唯一记录,如下所示:
订购 | 项目 |
---|---|
1234 | 001 |
1234 | 002 |
1235 | 001 |
1235 | 002 |
1235 | 003 |
1236 | 001 |
1237 | 001 |
... | ... |
该表目前有每个唯一组合的副本,如下所示:
订购 | 项目 |
---|---|
1234 | 001 |
1234 | 002 |
1235 | 001 |
1235 | 002 |
1235 | 003 |
1236 | 001 |
1237 | 001 |
1234 | 001 |
1234 | 002 |
1235 | 001 |
1235 | 002 |
1235 | 003 |
1236 | 001 |
1237 | 001 |
... | ... |
我正在使用以下子查询来选择所有重复的行:
SELECT * FROM (
SELECT order + item AS ID,
Row_Number() OVER(PARTITION BY order, item ORDER BY order) as CN
FROM [schema].[table]
)
AS Q WHERE Q.CN > 1
结果:
ID | CN |
---|---|
1234001 | 2 |
1234001 | 3 |
1234001 | 4 |
1234002 | 2 |
1234002 | 3 |
1234002 | 4 |
1235001 | 2 |
1235001 | 3 |
1235001 | 4 |
... | ... |
如果这是一个非常简单的问题,请原谅我,但是是否有一个简单的修改可以将上面的子查询变成删除语句并删除它当前选择的每条记录(即 CN > 1)?
您可以使用以下删除重复记录
DELETE FROM [schema].[table]
WHERE order + item IN (
SELECT order + item
FROM [schema].[table]
GROUP BY order, item
HAVING COUNT(*) > 1
)