我有一个令人头大我的大脑SQL挑战。我试图调和的应用程序的许可证两份报告。
第一份报告是访问数据库表。它已创建和我的前任手工维护。每当他们安装或卸载应用程序,他们将手动更新表,或多或少。它有多种不一致的数据,包括名称(显示名)网络ID(SAM帐户名)和计算机名称的列。每个记录对这些领域中的至少一个的值。大多数只值1或2,虽然。
第二份报告是基于SMS清单。它有三列:NETBIOSNAME计算机名称,SAM帐户名和显示名。每条记录都有一个NETBIOSNAME,但在SAM帐户名和显示名空一些。
我已导入这两种作为在MS SQL Server 2005数据库表。
我需要做的就是在Access表中的每个记录,是不是在SMS表,反之亦然的报告。我认为它可以用适当的形成来完成连接和where子句,但我看不出如何做到这一点。
编辑添加更多详细信息: 如果记录匹配的三列的至少一个,这是一个匹配。所以,我需要记录形成Access表,其中名称,NETWORKID和计算机名称都是从SMS表丢失。我可以对任何人列做到这一点,但我看不到如何将所有三个列结合起来。
以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
不知道记录是否会出现多次
你需要看看EXCEPT条款。这是新的SQL Server 2005和做Oracle的MINUS做同样的事情。
SQL1 EXCEPT SQL2
会给你在SQL1中的所有行SQL2如果未找到
SQL1 = A,B,C,d SQL2 = B,C,E
其结果是A,d
在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
看看自带的SQL Server中tabeldiff.exe。
尝试以下方法:
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