【问题标题】:Get the same clients by phone number or email通过电话号码或电子邮件获得相同的客户
【发布时间】:2017-09-05 07:37:27
【问题描述】:

我的数据库中有带有电子邮件和电话字段的客户。他们中的一些人有电话和电子邮件,有的只有电子邮件,有的只有电话。不同客户之间的电话和电子邮件不能是唯一的。

我需要创建虚拟表,其中数据库将计算具有相同电子邮件或电话的客户作为同一个客户。例如,我有一张桌子:

Phone  Email   ID
916    x@.com  1
       x@.com  2
916            3
915            4

查询应创建第 4 列,它将为 ID 为 1、2 和 3 的客户端显示唯一的相同值。

结果应该是这样的

Phone  Email   ID  NewID
916    x@.com  1   1
       x@.com  2   1
916            3   1
915            4   2
917    x@.com  5   1
917    y@.en   6   1

【问题讨论】:

  • 将预期结果指定为表格,此处也是格式化文本。
  • 请标记您的DBMS,每个可能有不同的解决方案
  • 是否总会有一条同时包含电话和电子邮件的记录?并且是否有一个额外的列对于可以在 group by 中使用的记录具有相同的值?就像 f.e.客户名称?
  • 任何 DBMS 都适合,我只需要知道如何做到这一点(MySQL、Postgres、SQL Server 等)。在大多数情况下,不会有电话和电子邮件的记录。并且没有具有相同值的额外列 :( 如果电话有两条记录,我需要它们的唯一 ID,如果有两条只有电子邮件的记录,我需要它们的唯一 ID。
  • 请为每个可能的数据集定义规则。如果添加 (917 , x@.com, 5) 会怎样? (null, x@.com, 2) Newid 会得到哪个?

标签: sql database


【解决方案1】:

嗯,

SELECT
          T.[Id]
          T.[Phone]
          T.[Email]
          E.[Id] [NewId]    
   FROM
          [Table] T
       JOIN
          [Table] E
              ON T.[Email] = E.[Email]
UNION
SELECT
          T.[Id]
          T.[Phone]
          T.[Email]
          P.[Id] [NewId]    
   FROM
          [Table] T
       JOIN
          [Table] P
              ON T.[Phone] = P.[Phone];

【讨论】:

    【解决方案2】:

    您可以通过电话或电子邮件自行加入餐桌。
    然后 GROUP BY 并使用 MIN 显示最低 ID。

    示例:

    select t.Phone, t.Email, t.ID, min(t2.ID) as NewID
    from YourTable t
    left join YourTable t2 on (t2.Email = t.Email or t2.Phone = t.Phone)
    group by t.ID, t.Phone, t.Email
    

    示例结果:

    Phone Email  ID NewID
    ----- ------ -- -----
    916   x@.com 1  1
    NULL  x@.com 2  1
    916   NULL   3  1
    915   NULL   4  4
    NULL  y@.com 5  5
    

    但是要获得预期的结果吗?
    到手机的链接在哪里有优先权,即使它是 NULL?
    您可以使用额外的自我加入:

    示例:

    select t.Phone, t.Email, t.ID, coalesce(min(t3.ID), min(t2.ID)) as NewID
    from YourTable t
    left join YourTable t2 on (t2.Email = t.Email or t2.Phone = t.Phone)
    left join YourTable t3 on (t3.Email = t2.Email or (t.Email is null and t3.Email is not null and t3.Phone is null))
    group by t.ID, t.Phone, t.Email
    

    示例结果:

    Phone Email   ID NewID
    ----- ------- -- -----
    916   x@.com  1  1
    NULL  x@.com  2  1
    916   NULL    3  1
    915   NULL    4  2
    917   x@.com  5  1
    917   y@.en   6  1
    

    【讨论】:

      【解决方案3】:

      您的示例看起来像您,新列只是具有相同电话或电话号码的行的min(id)

      所以

      SELECT DISTINCT a.phone, a.email, a.id, min(b.id) 
      from clients a join clients b on (a.phone = b.phone OR a.email = b.email)
      

      【讨论】:

      • 这将导致错误,因为您需要按a.phone, a.email, a.id分组
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2015-12-22
      相关资源
      最近更新 更多