【问题标题】:CTE to find duplicates?CTE 查找重复项?
【发布时间】:2018-09-18 15:26:29
【问题描述】:

有人可以告诉我如何添加到此 CT​​E 以包含存储在另一个名为“WeccoPartyAddress”的表中的“地址类型”列吗?

我正在尝试查找名字和姓氏以及地址类型地址 = 'Mailing' 的邮寄地址的重复项

with dups as (
 select 
      wp.GtId
 from CORE.WeccoParty wp
 where exists (select 1
              from CORE.WeccoParty wpe
              where wp.FirstName = wpe.FirstName
              and   wp.LastName  = wpe.LastName
              and   wp.Dob       = wpe.Dob
             and     wp.GtId     <> wpe.GtId
             ) 

  )
  select distinct
      wp.GtId, 
      wp.CrmPartyId, 
      wp.LegalName, 
      wp.BusinessClass, 
      wp.RmFullName, 
      wp.PbeFullName, 
      wp.OverallClientStatus, 
      wp.OverallRpStatus, 
      wp.FirstName + ' ' + wp.LastName FullName, 
      wp.Dob
   from CORE.WeccoParty wp
   join dups d on d.GtId = wp.GtId
   order by 9,1

【问题讨论】:

  • 考虑到您没有分享您的地址表的外观以及它与您的派对表的关系,这将很难回答。另外,不要按这样的序数值排序。这不是最佳实践,如果您更改 select 语句,将返回不同的结果。按明确的名称和别名排序。
  • Address 表和 Party 表中也有一个 'gtid'。不过感谢您的评论。还有一个 CRMPartyRoleID 加入到派对表 CRMPartyID
  • 编辑我的评论太晚了,但我的意思是说它会以与预期不同的顺序返回结果,而不是返回实际不同的结果。
  • 欢迎来到 Stack Overflow!其他用户将您的问题标记为低质量和需要改进。我重新措辞/格式化您的输入,使其更容易阅读/理解。请查看我的更改以确保它们反映您的意图。但我认为你的问题仍然无法回答。 现在应该edit你的问题,添加缺失的细节(见minimal reproducible example)。如果您对我有其他问题或反馈,请随时给我留言。

标签: sql sql-server join common-table-expression


【解决方案1】:

考虑通过将外部查询和子查询中的JOIN 子句添加到具有所需WHERE 子句的WeccoPartyAddress 表来扩展您的CTE。还要注意添加的distinct 以避免表之间可能的一对多关系重复ID。

with dups as (
 select distinct p.GtId
 from CORE.WeccoParty p
 join CORE.WeccoPartyAddress a ON p.GtId = a.GtId

 where exists (select 1
               from CORE.WeccoParty sub_p
               left join CORE.WeccoPartyAddress sub_a 
                 on sub_p.GtId = sub_a.GtId and sub_a.AddressType = 'Mailing'
               where (p.FirstName     =  sub_p.FirstName
                      and p.LastName  =  sub_p.LastName
                      and p.Dob       =  sub_p.Dob
                      and p.GtId      <> sub_p.GtId)
                      and a.MailingAddress =  sub_a.MailingAddress
                      and a.GtId           <> sub_a.GtId
              ) 
)

根据数据和关系(例如,GtId 是否可以具有相同的生物详细信息和/或相同的邮寄地址?),您可能需要了解更多信息,您可能需要调整上述查询。这些可能涉及将left join 交换为join 和/或WHERE 条件,例如:

where (p.FirstName     =  sub_p.FirstName
       and p.LastName  =  sub_p.LastName
       and p.Dob       =  sub_p.Dob
       and p.GtId      <> sub_p.GtId)
   or
      (a.MailingAddress =  sub_a.MailingAddress
       and a.GtId       <> sub_a.GtId)

【讨论】:

  • 感谢您。唯一的问题是在“sub_a”中没有“邮寄地址”字段我该如何解决这个问题?
  • 我解释说,我正在尝试查找名字和姓氏的重复项,以及地址类型地址 = 'Mailing' 的邮寄地址,因为邮寄地址是一个字段。根据需要进行调整。否则,如评论所示,显示所有字段和表的数据库模式。您只想检查 AddressType 吗?然后将其从ON 子句中移动以替换WHERE 中的地址。
猜你喜欢
  • 2018-09-23
  • 2019-08-18
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2014-04-02
  • 1970-01-01
相关资源
最近更新 更多