【问题标题】:How can I find duplicate records \ values after left join?左连接后如何找到重复的记录\值?
【发布时间】:2019-10-08 16:05:45
【问题描述】:

我有:

  • 带有 ID 和名称的 TABLE1。
  • 带有 ID 和地址的 TABLE2。

我想获取所有 TABLE1 记录并添加一个 STATUS 列:

  • 如果 TABLE2 中存在此记录 - 'OK'。
  • 如果 TABLE2 中不存在此记录,则按最后 2 位搜索匹配项,否则为“NO_RECORD”。
  • 如果该记录在 TABLE2 中有重复记录,则如果重复记录具有相同的地址,则选择一条记录 - 'OK',如果它们不具有相同的地址 - 'DUPLICATE'。

与此同时,我已经开始这样做了:

SELECT t1.id,
 t1.name,
 t2.Address,
 iif(Address is null, 'No_RECORD', 'Ok') as 'status'
FROM Table1 as t1
left join Table2 as t2 on t1.id = t2.id

例如:

表1

 id     Name
 111    aaa
 222    bbb
 333    ccc 
 444    ddd
 555    eee
 666    fff
 777    ggg
 888    hhh
 999    iii

表2:

id  Address
111 rr
922 hfh 
444 vbv
444 vbv
555 xxa
555 plo
555 plo
666 wqq
777 gyt
999 ree
999 ree

我接受的结果是:

id  name Address 'status'
111 aaa  rr      Ok
222 bbb  hfh     Ok
333 ccc          No_RECORD
444 ddd  vbv     Ok
555 eee          Duplicate
666 fff  fff     Ok
777 ggg  wqq     Ok
888 hhh          No_RECORD
999 iii  ree     Ok
  • 444不重复,因为2个table2的记录地址是匹配的,
  • 555是重复的,因为3个table2的记录地址不匹配,
  • 999 不重复,因为 2 个 table2 的记录地址匹配。
  • 222 可以,因为它的 id 的最后 2 位存在于 tabl2: "922" 中。

我该如何继续? (我在access中使用sql查询)。

【问题讨论】:

  • 向我们展示一些示例表数据和预期结果 - 作为格式化文本,没有图像。看看stackoverflow.com/help/reprex
  • 这是什么意思? “如果 TABLE2 中不存在此记录,则按最后 5 位搜索匹配项,否则为 'NO_RECORD'。”

标签: sql ms-access duplicates


【解决方案1】:

我不知道“最后五位匹配”是什么意思。它与您的示例数据无关,所以我只是忽略了这部分问题。

你想要做的是在做join之前聚合table2

select t1.id, t1.name,
       iif(multiple_addresses = 0, address, null) as address,
       switch(t2.id is null, "No_Record",
              multiple_addresses = 1, "Duplicate",
              1=1, "OK"
             ) as status
from table1 as t1 left join
     (select id, min(address) as address
             iif(min(address) = max(address), min(address), 0, 1) as multiple_addresses
      from table2
      group by id
     ) as t2
     on t1.id = t2.id;

【讨论】:

    【解决方案2】:

    您可以使用case 语句来获取此状态:

    SELECT
     t1.id,
     t1.name,
     t2.Address as add2,
     case 
      when t2.Address is null and exists (select 1 from Table2 temp where temp.id = t1.id) then 'DUPLICATE'
      when t2.Address is null then 'NO_RECORD'
      else 'OK' end
     as 'status'
    FROM Table1 as t1
    left join Table2 as t2 on t1.id = t2.id and t1.name = t2.Address
    order by t1.id
    

    如您所见,我在 join 子句中添加了 and t1.name = t2.Address,以确保仅在需要时才具有非空 Table2 值。

    关于case when,第一个条件检查是否 1) 没有找到对应的记录 2) 有相同 id 的记录,意思是“DUPLICATE”。第二个条件检查没有对应的记录,并且我们已经知道没有重复(因为它会属于第一种情况)。

    Working SQLFiddle.

    【讨论】:

    • 谢谢。您的答案几乎完美。我已经编辑了我的问题,你能再看一遍吗?
    • 什么不符合您的预期?
    • 如果我们添加样本,预连接数据和预期结果会更容易
    • 除非您添加涵盖您提到的所有案例的示例数据,尤其是最后两位数,否则我不会更新我的答案。
    • 我已经修好了。谢谢!
    猜你喜欢
    • 2021-12-25
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2021-01-11
    • 2017-03-01
    • 2017-06-30
    相关资源
    最近更新 更多