首页 > 解决方案 > 删除不同列中的重复行

问题描述

表格1:

id   name  address1   address2  address3
------------------------------------------
1    Jenny    A         B        NULL
2    John     C        NULL      NULL
3    Jenny    B         A        NULL
4    John    NULL      NULL       C

......

id1并且id3在这种情况下是相同的,id2并且id4也是相同的。

我可以删除id3id4吗?我正在使用 SQL Server 2019。

标签: sqlsql-server

解决方案


如果您使用的是 SQL Server 2017 或更高版本,则可以使用STRING_AGG;根据名称和每个地址字段为每一行构建一个唯一标识符。然后找到该值每次出现的行号(按 排序id),然后您可以删除行号 > 1 的行:

WITH CTE AS (
  SELECT id, name AS value
  FROM data
  UNION ALL
  SELECT id, address1
  FROM data
  UNION ALL
  SELECT id, address2
  FROM data
  UNION ALL
  SELECT id, address3
  FROM data
),
CTE2 AS (
  SELECT id, STRING_AGG(value, '%') WITHIN GROUP (ORDER BY value) AS v
  FROM CTE
  GROUP BY id
),
CTE3 AS (
  SELECT id, v,
         ROW_NUMBER() OVER (PARTITION BY v ORDER BY id) AS rn
  FROM CTE2
)
DELETE d
FROM data d
JOIN CTE3 ON CTE3.id = d.id
WHERE CTE3.rn > 1

SQLFiddle 上的演示


推荐阅读