在sqlserver中有一个表db, 包含字段orgId, websiteName, supplierShortName.
表db中有多条重复数据,请写一个sql查询语句,根据字段orgId删除重复的行
WITH CTE AS (
SELECT orgId, websiteName, supplierShortName,
ROW_NUMBER() OVER (
PARTITION BY orgId ORDER BY (SELECT NULL)
) AS RN
FROM db
)
DELETE FROM CTE WHERE RN > 1;
该语句使用了CTE(公共表表达式)和窗口函数的组合。首先,CTE将表db中按照 orgId 分组后每组中重复的行编号(RN)起来。接着,在 DELETE 语句中,使用 CTE 来删除RN大于1的行。由于窗口函数 ROW_NUMBER 会为每组中的行分配连续的数字,因此RN大于1的行即为重复的行,而RN等于1的行是每组中的第一行,即不重复的行,因此不会被删除。
同时,由于 ORDER BY 子句需要在此场景下使用,但没有真正的排序需求,选择了 (SELECT NULL) 作为排序依据,表示不排序。
请注意,在执行删除操作之前,最好先备份数据。 若要使用此SQL语句,将 db 更改为您的表名即可。