我有一个简单的要求,有3个SQL Server表,如下所示:
-
表1;列
AID Name DOB Gender PostCode
-
表2;列
BID Name DOB Gender PostCode
-
表3;列
CID Name DOB Gender PostCode
我希望根据姓名、出生日期、性别和性别加入(内部加入(;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个记录。
我们将感谢您的帮助/答复。
感谢
您可以使用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;