我的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。我可以为任何一个列做这个,但我看不出如何组合所有三列。
答案 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