【问题标题】:Update duplicate values in a table更新表中的重复值
【发布时间】:2014-01-22 09:21:28
【问题描述】:

我有一个表格,在某些列中有一些重复的日期。

例如:我有一个包含名称、电子邮件和更多列的表,其中一些行具有相同的名称和电子邮件值。我不想删除这些重复项,因为我有每行所需的其他信息。但是还有第三列“电话”需要根据姓名和电子邮件值进行更新。所以基本上重复的行应该有相同的电话号码。

标准更新查询:

update table a set a.phone = (select b.phone from table b where b.name = a.name and b.email = a.email);

返回“子查询返回多于 1 行错误”。

我有什么办法可以更新我所有行(包括重复行)的电话列吗?

【问题讨论】:

  • 您如何确定应该使用哪些电话号码?
  • 显然,如果有必要,您可能需要进一步规范化您的数据。

标签: mysql sql sql-update subquery


【解决方案1】:

我不确定此查询是否能解决您的问题。但是您的子查询返回了不止一行,因此您可以选择子查询的前 1 条记录。

update table a set a.phone = (select top 1 b.phone from table b where b.name = a.name and b.email = a.email)

【讨论】:

  • 每一行的子查询计算。如果表有很多行,那么查询将不会快速执行。我认为updatejoin 会更好。
  • @OP:子查询可能需要一个额外的过滤条件,比如时间戳,因为目前尚不清楚您希望复制哪个“电话”值。
  • @AnirudhR 我们可以使用更新表 a 与表连接,例如 SELECT MIN(phone), name, email FROM b GROUP BY name, email - 现在我们知道 phone 匹配对 nameemail
【解决方案2】:
UPDATE a
INNER JOIN 
(SELECT MIN(phone) AS phone, `name`, email FROM b GROUP BY NAME, email) AS t
ON a.name = t.name AND a.email = t.email
SET a.phone = t.phone

【讨论】:

    【解决方案3】:

    试试这个,但它是 t-sql 。确保表 A 有别名

    update a set 
    a.phone = B.phone
    FROM A as a
    INNER JOIN
    B
    ON a.name=B.name AND a.email=B.email
    

    【讨论】:

      猜你喜欢
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2020-11-13
      • 2012-07-03
      • 1970-01-01
      • 2013-03-18
      相关资源
      最近更新 更多