插件窝 干货文章 如何删除数据库中字段相同但特定列值为空的重复行?

如何删除数据库中字段相同但特定列值为空的重复行?

字段 特定 删除 SELECT 799    来源:    2025-03-31

删除数据库中字段相同但特定列值为空的重复行

要删除数据库中字段相同但特定列值为空的重复行,可以使用以下几种方法,具体取决于您使用的数据库系统:

SQL Server 解决方案

WITH CTE AS (
    SELECT *,
           ROW_NUMBER() OVER (
               PARTITION BY 字段1, 字段2, 字段3 /* 需要判断重复的字段 */
               ORDER BY CASE WHEN 特定列 IS NULL THEN 1 ELSE 0 END /* 优先保留非空值 */
           ) AS RowNum
    FROM 表名
)
DELETE FROM CTE WHERE RowNum > 1;

MySQL 解决方案

DELETE t1 FROM 表名 t1
INNER JOIN 表名 t2 
WHERE 
    t1.id > t2.id /* 假设有自增ID,保留ID较小的记录 */
    AND t1.字段1 = t2.字段1 
    AND t1.字段2 = t2.字段2 
    AND /* 其他判断重复的字段 */
    (t1.特定列 IS NULL OR t2.特定列 IS NULL);

PostgreSQL 解决方案

DELETE FROM 表名
WHERE id IN (
    SELECT id FROM (
        SELECT id,
               ROW_NUMBER() OVER (
                   PARTITION BY 字段1, 字段2, 字段3
                   ORDER BY CASE WHEN 特定列 IS NULL THEN 1 ELSE 0 END
               ) AS rn
        FROM 表名
    ) t
    WHERE t.rn > 1
);

Oracle 解决方案

DELETE FROM 表名
WHERE ROWID IN (
    SELECT ROWID FROM (
        SELECT ROWID,
               ROW_NUMBER() OVER (
                   PARTITION BY 字段1, 字段2, 字段3
                   ORDER BY CASE WHEN 特定列 IS NULL THEN 1 ELSE 0 END
               ) AS rn
        FROM 表名
    )
    WHERE rn > 1
);

通用建议

  1. 先备份数据:在执行删除操作前,建议先备份表数据
  2. 先查询验证:可以先运行SELECT版本的查询查看将被删除的记录
  3. 事务处理:在事务中执行删除,以便可以回滚
BEGIN TRANSACTION;
-- 执行删除语句
-- 检查结果
COMMIT; -- 或 ROLLBACK;

您需要根据具体的数据库类型和表结构调整上述SQL语句。如果您能提供更具体的数据库环境和表结构信息,我可以给出更精确的解决方案。