SQL 查找重复项并更新值

时间:2021-04-07 14:48:51

标签: sql sql-server

我有一个表,其中包含重复的姓名和电子邮件,但具有不同的标识符和其他相关数据。在这种情况下,标识符不必必须是唯一的。以下是数据示例:

<头>
课程 用户代码 名字 姓氏 电子邮件地址
经济 SKNKZ62HR28 约翰 能源部 john.doe@gmail.com
语言 C6NV4LQS5D4 约翰 能源部 john.doe@gmail.com
科学 H9NNVNWVPM9 弗雷德 能源部 fred.doe@gmail.com
政府 JVNH2BVTD3V 能源部 jane.doe@gmail.com
数学 L2NK8S49N5G 能源部 jane.doe@gmail.com

我需要做的是更新 user_code 以便 John Doe 为两个课程使用相同的 user_code

<头>
课程 用户代码 名字 姓氏 电子邮件地址
经济 SKNKZ62HR28 约翰 能源部 john.doe@gmail.com
语言 SKNKZ62HR28 约翰 能源部 john.doe@gmail.com
科学 H9NNVNWVPM9 弗雷德 能源部 fred.doe@gmail.com
政府 L2NK8S49N5G 能源部 jane.doe@gmail.com
数学 L2NK8S49N5G 能源部 jane.doe@gmail.com

我已经能够使用此代码识别我的重复项:

SELECT a.*
FROM attendees a
JOIN 
    (SELECT [Email Address], [Last Name], [First Name], COUNT(*) AS number
     FROM attendees 
     GROUP BY [Email Address], [Last Name], [First Name]
     HAVING count(*) > 1) b ON a.[Email Address] = b.[Email Address]
                            AND a.[Last Name] = b.[Last Name]
                            AND a.[First Name] = b.[First Name]
ORDER BY a.[Email Address]

我不确定接下来的步骤。

1 个答案:

答案 0 :(得分:1)

如果只想查询返回结果集,可以使用:

select a.*,
       max(user_code) over (partition by firstname, lastname, emailaddress) as imputed_user_code
from attendees a;

进行更新的最佳方式取决于数据库。方括号表示 SQL Server,它具有可更新的 CTE。这允许:

with toupdate as (
      select a.*,
             max(user_code) over (partition by firstname, lastname, emailaddress) as imputed_user_code
      from attendees a
     )
update toupdate
     set user_code = imputed_user_code
     where user_code <> imputed_user_code;