【问题标题】:how use distinct in second join table in sql server如何在 sql server 的第二个连接表中使用 distinct
【发布时间】:2013-12-24 00:50:12
【问题描述】:

我有一个由 id、name、email 组成的 SQL 表……我有另一个包含 id、email、emailstatus 的 SQL 表,但这两个 id 不同,它们不相关。这两个表之间唯一的共同点是电子邮件。

我想加入这 2 个表,将表 1 中的所有信息带入表 1 和表 2 中的电子邮件地址是否相同且电子邮件状态为“已退回”。但是我正在写的查询给了我比我预期的更多的记录,因为 tbl_webhook(第二个表) 中有多个行对于申请人(第一个表)中的每一行。我想知道申请人是否曾经有过电子邮件退回。

没有加入的查询显示 23000 条记录,但加入后显示 42000 条记录,这是因为重复我如何才能保持相同的 23000 条记录只添加第二个表中的信息?

这是我的查询:

  SELECT
  A.[Id]
 ,A.[Application]
 ,A.[Loan]
 ,A.[Firstname]
 ,A.[Lastname]
 ,A.[Email],
 ,H.[Email], H.[EmailStatus] as BouncedEmail 
 FROM Applicant A (NOLOCK)

left outer join [tbl_Webhook] [H] (NOLOCK)
on A.Email = H.Email
and H.[event]='bounced' 

这是所需数据的样本:

id   email               name    emailFromTable2    emailstatus
1    test2@yahoo.com     lili    test2@yahoo.com    bounced
2    tesere@yahoo.com    mike    Null               Null
3    tedfd2@yahoo.com    nik     tedfd2@yahoo.com   bounced
4    tdfdft2@yahoo.com   sam     Null               Null              
5    tedft2@yahoo.com    james   tedft2@yahoo.com   bounced
6    tedft2@yahoo.com    San     Null 

【问题讨论】:

标签: sql sql-server sql-server-2008


【解决方案1】:

对此类查询使用嵌套的select。我会这样写:

select id, application, load, firstname, lastname, email,
       (case when BouncedEmail is not null then email end) as EmailFromTable2,
       BouncedEmail
from (SELECT A.[Id], A.[Application], A.[Loan], A.[Firstname], A.[Lastname], A.[Email],
             (case when exists (select 1
                                from tbl_WebHook h
                                where A.Email = H.Email and H.[event] = 'bounced'
                               )
                   then 'bounced
              end) as BouncedEmail
      FROM Applicant A (NOLOCK)
     ) a

您也可以使用cross apply 执行此操作,但由于您确实只需要一列,因此相关子查询也可以。

【讨论】:

    【解决方案2】:
    ;WITH DistinctEmails
    AS
      (
      SELECT * , rn =  ROW_NUMBER() OVER (PARTITION BY [Email] ORDER BY [Email])
      FROM [tbl_Webhook]
      )
    SELECT
      A.[Id]
     ,A.[Application]
     ,A.[Loan]
     ,A.[Firstname]
     ,A.[Lastname]
     ,A.[Email],
     ,H.[Email], H.[EmailStatus] as BouncedEmail 
     FROM Applicant A (NOLOCK) left outer join DistinctEmails [H] (NOLOCK)
    on A.Email = H.Email  
    WHERE H.rn = 1
    and H.[event]='bounced'
    

    【讨论】:

      【解决方案3】:

      我相信下面的查询应该足以为您选择不同的退回电子邮件,加油 :)

      SELECT
      A.[Id]
      ,A.[Application]
      ,A.[Loan]
      ,A.[Firstname]
      ,A.[Lastname]
      ,A.[Email],
      ,H.[Email], H.[EmailStatus] as BouncedEmail 
      FROM Applicant A (NOLOCK)
      
      Inner join [tbl_Webhook] [H] (NOLOCK)
      on A.Email = H.Email
      and H.[EmailStatus]='bounced' 
      

      基本上我只是将连接更改为内部连接并将第二个表条件从事件更改为电子邮件状态,如果您可以提供您的表结构和示例数据,我相信我可以帮助您:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        • 2019-11-28
        • 1970-01-01
        • 2017-11-27
        相关资源
        最近更新 更多