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

时间:2008-11-24 19:39:53

标签: sql sql-server

我的SQL挑战让我的大脑陷入困境。我正在尝试协调两个应用程序许可证的报告。

第一个报告是访问数据库表。它由我的前辈手工创建和维护。无论何时安装或卸载应用程序,他们都会或多或少地手动更新表。它有各种不一致的数据列,包括Name(displayName)网络ID(SAMAccountName)和计算机名称。每条记录至少有一个这些字段的值。但是,大多数只有1或2个值。

第二份报告基于短信广告资源。它有三列:计算机名称的NetbiosName,SAMAccountName和displayName。每条记录都有一个NetbiosName,但SAMAccountName和displayName中有一些空值。

我已将这两个作为表导入MS SQL Server 2005数据库中。

我需要做的是获取Access表中不在SMS表中的每条记录的报告,反之亦然。我认为可以通过正确形成的join和where子句来完成,但我看不出怎么做。

编辑以添加更多详细信息:
如果记录与三列中的至少一列匹配,则匹配。所以我需要Access表中的记录,其中SMS表中缺少Name,NetworkID和ComputerName。我可以为任何一个列做这个,但我看不出如何组合所有三列。

5 个答案:

答案 0 :(得分: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 :(得分:1)

您需要查看EXCEPT子句。它是SQL SERVER 2005的新功能,与Oracle的MINUS完全相同。

SQL1 除了 SQL2

将为您提供SQL1中找不到的SQL1中的所有行 IF

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

结果是A,D

答案 2 :(得分: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

答案 3 :(得分:1)

看一下sql server附带的tabeldiff.exe

答案 4 :(得分: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