SQL连接找到两个数据源之间的不一致

问题描述 投票:3回答:5

我有一个令人头大我的大脑SQL挑战。我试图调和的应用程序的许可证两份报告。

第一份报告是访问数据库表。它已创建和我的前任手工维护。每当他们安装或卸载应用程序,他们将手动更新表,或多或少。它有多种不一致的数据,包括名称(显示名)网络ID(SAM帐户名)和计算机名称的列。每个记录对这些领域中的至少一个的值。大多数只值1或2,虽然。

第二份报告是基于SMS清单。它有三列:NETBIOSNAME计算机名称,SAM帐户名和显示名。每条记录都有一个NETBIOSNAME,但在SAM帐户名和显示名空一些。

我已导入这两种作为在MS SQL Server 2005数据库表。

我需要做的就是在Access表中的每个记录,是不是在SMS表,反之亦然的报告。我认为它可以用适当的形成来完成连接和where子句,但我看不出如何做到这一点。

编辑添加更多详细信息: 如果记录匹配的三列的至少一个,这是一个匹配。所以,我需要记录形成Access表,其中名称,NETWORKID和计算机名称都是从SMS表丢失。我可以对任何人列做到这一点,但我看不到如何将所有三个列结合起来。

sql sql-server
5个回答
3
投票

以Kaboing的回答和编辑的问题,解决办法似乎是:

SELECT *
FROM report_1 r1 
FULL OUTER JOIN report_2 r2 
    ON r1.SAMAccountName = r2.SAMAccountName
    OR r1.NetbiosName = r2.NetbiosName
    OR r1.DisplayName = r2.DisplayName
WHERE r2.NetbiosName IS NULL OR r1.NetbiosName IS NULL

不知道记录是否会出现多次


1
投票

你需要看看EXCEPT条款。这是新的SQL Server 2005和做Oracle的MINUS做同样的事情。

SQL1 EXCEPT SQL2

会给你在SQL1中的所有行SQL2如果未找到

SQL1 = A,B,C,d SQL2 = B,C,E

其结果是A,d


1
投票

在Gabriel1836的答案的基础上,更加简单,但也许有点难以解释:

SELECT *
FROM report_1 r1 
FULL OUTER JOIN report_2 r2 ON r1.SAMAccountName = r2.SAMAccountName
WHERE r2.SAMAccountName IS NULL OR r1.SAMAccountName IS NULL

1
投票

看看自带的SQL Server中tabeldiff.exe


0
投票

尝试以下方法:

SELECT displayName, 'report_1' as type
FROM report_1 r1 
LEFT OUTER JOIN report_2 r2 ON r1.SAMAccountName = r2.SAMAccountName
WHERE r2.SAMAccountName IS NULL
UNION
SELECT displayName, 'report_2' as type
FROM report_1 r1
RIGHT OUTER JOIN report_2 r2 ON r1.SAMAccountName = r2.SAMAccountName
WHERE r1.SAMAccountName IS NULL
© www.soinside.com 2019 - 2024. All rights reserved.