【问题标题】:Compare 3 SQL Server tables and once matched based on some attribute put the result on one table when not matched put the result in another比较 3 个 SQL Server 表,一旦根据某个属性匹配,则将结果放在一个表中,当不匹配时将结果放在另一个表中
【发布时间】:2021-08-05 01:17:27
【问题描述】:

我有一个简单的要求,有 3 个这样的 SQL Server 表:

  • 表 1;列

      AID  Name  DOB  Gender  PostCode
    
  • 表 2;列

      BID  Name  DOB  Gender  PostCode
    
  • 表 3;列

      CID  Name  DOB  Gender  PostCode
    

我希望基于姓名、出生日期、性别和邮政编码跨所有表加入(内部联接),如果记录匹配,我想将结果放在一个表中,其余记录我希望放在另一个表中用于进一步比较/处理。

这个查询的第一部分很简单:

SELECT AID, BID, CID, A.Name, A.DOB, A.Gender, A.PostCode
FROM TAB_A
JOIN TAB_B B ON A.Name = B.Name 
             AND A.DOB = B.DOB 
             AND A.Gender = B.Gender 
             AND A.PostCode = B.PostCode
JOIN TAB_C C ON A.Name = C.Name 
             AND A.DOB = C.DOB 
             AND A.Gender = C.Gender 
             AND A.PostCode = C.PostCode

但是对于剩余的不匹配记录的第二部分需要将它们放在单独的表中。

例如,如果所有 3 个表中总共有 50 条记录(A = 20,B=20 & C=10),并且根据上述查询匹配所有记录的输出为 5,我希望存储单独的表中有 95 条记录。

您的帮助/回答将不胜感激。

谢谢

【问题讨论】:

  • 虽然这似乎是一种非常奇怪的连接表的方式,但对于一个人来说,您的连接条件并不是唯一的。请向我们展示您的尝试。
  • 下面的答案有帮助吗?你熟悉接受答案吗?
  • 是的,我对接受答案很熟悉,让我试试下面的查询。同样在加入时,我不仅要尝试匹配列并在匹配时给它们一些分数,因此在非唯一列上

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

您可以使用union all 组合表格。然后使用窗口函数按您关心的列计算匹配项。

返回匹配小于3的行:

select id, Name, DOB, Gender, PostCode
from (select id, Name, DOB, Gender, PostCode,
count(*) over (partition by Name, DOB, Gender, PostCode) as cnt
      from ((select AID as id, Name, DOB, Gender, PostCode
             from a
            ) union all
            (select BID, Name, DOB, Gender, PostCode
             from b
            ) union all
            (select CID, Name, DOB, Gender, PostCode
             from c
            )
           ) abc
      ) abc
where cnt < 3;

【讨论】:

  • 感谢 Gordon 的快速回复。赞赏。然而,在决赛桌中,我正在寻找所有 ID,即 AID、BID 和 CID,因为它们来自不同的来源。所以我需要的最终表应该有列名,如 AID、BID、CID、Name、DOB、Gender、PostCode。抱歉没有提早
  • 这个想法是,如果内部连接上的所有 3 个 SQL 表中的属性都匹配,我会给它们一些分数,对于剩余的记录,我将根据更少的属性匹配来为它们提供分数。例如 - 如果属性在所有 3 个表中都不匹配,我将选择剩余的记录并仅在 2 个表中进行比较。希望它能解释。
  • @Nitesh 。 . .这有原始表中的 rows (这是我解释你的问题的方式),所以 id 在那里但在不同的行中。
  • 当然让我尝试同样的方法并感谢您的帮助。谢谢
  • 上述方法有效,我也尝试过。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
相关资源
最近更新 更多