比较3个SQL Server表,一旦根据某个属性匹配,则将结果放在一个表中,如果不匹配,则将结果放在另一个表中
我有一个简单的要求,有3个SQL Server表,如下所示: 表1;纵队比较3个SQL Server表,一旦根据某个属性匹配,则将结果放在一个表中,如果不匹配,则将结果放在另一个表中,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我有一个简单的要求,有3个SQL Server表,如下所示: 表1;纵队 AID Name DOB Gender PostCode 表2;纵队 BID Name DOB Gender PostCode 表3;纵队 CID Name DOB Gender PostCode 我希望在所有表中基于姓名、出生日期、性别和邮政编码连接内部连接,如果记录匹配,我希望将结果放在一个表中,其余记录放在另一个表中,以便进一步比较/处理 第一部分简单介绍了此查询: SELE
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个表A=20、B=20和C=10中总共有50条记录,并且根据上述查询所有记录匹配的输出为5,我希望在单独的表中存储95条记录
您的帮助/答复将不胜感激
谢谢您可以使用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;
这似乎是一种非常奇怪的连接表的方式,但是,当涉及到一个人时,您的连接条件并不是唯一的。请告诉我们你尝试了什么。下面的答案有用吗?你熟悉接受答案吗?是的,我熟悉接受答案,让我试试下面的问题。此外,在加入it时,我不仅尝试匹配各专栏,如果它们匹配,我会给它们一些分数。因此,在非唯一专栏上,感谢Hanks Gordon的快速回复。谢谢。然而,在最后的表格中,我要查找所有ID,即AID、BID和CID,因为它们来自不同的来源。所以我需要的最后一个表应该有列名称,如AID、BID、CID、Name、DOB、Gender、PostCode。抱歉没有提前提及。如果属性与内部联接上所有3个SQL表中的属性匹配,我将给它们一些分数,对于剩余的记录,我将基于更少的属性进行匹配以给它们分数。例如,如果属性在所有3个表中都不匹配,我将选择剩余的记录并仅在2个表中进行比较。希望这是我的梦想。@Nitesh。这是原始表格中的行,这是我如何解释您的问题的,因此ID在那里,但在不同的行中。当然,让我尝试相同的方法,并感谢您的帮助。感谢以上的工作,我也尝试过同样的方法。谢谢你的帮助