SQL-соединение, чтобы найти несоответствия между двумя источниками данных - PullRequest
3 голосов
/ 24 ноября 2008

У меня есть вызов SQL, который поражает мой мозг. Я пытаюсь согласовать два отчета для лицензий приложения.

Первый отчет - это таблица базы данных доступа. Он был создан и поддерживается вручную моими предшественниками. Каждый раз, когда они устанавливали или удаляли приложение, они обновляли таблицу более или менее вручную. Он содержит различные столбцы противоречивых данных, в том числе имя (displayName), идентификатор сети (SAMAccountName) и имя компьютера. Каждая запись имеет значение хотя бы для одного из этих полей. Большинство из них имеют только 1 или 2 значения.

Второй отчет основан на инвентаризации SMS. Он имеет три столбца: NetbiosName для имени компьютера, SAMAccountName и displayName. Каждая запись имеет имя NetbiosName, но в SAMAccountName и displayName есть несколько нулей.

Я импортировал оба этих файла в виде таблиц в базу данных MS SQL Server 2005.

Что мне нужно сделать, так это получить отчет по каждой записи в таблице Access, которой нет в таблице SMS, и наоборот. Я думаю, что это можно сделать с помощью правильно сформированного соединения и предложения where, но я не понимаю, как это сделать.

Изменить, чтобы добавить больше деталей:
Если записи соответствуют хотя бы одному из трех столбцов, это совпадение. Поэтому мне нужны записи из таблицы Access, в которой имя, NetworkID и ComputerName отсутствуют в таблице SMS. Я могу сделать это для любого столбца, но не вижу, как объединить все три столбца.

Ответы [ 5 ]

3 голосов
/ 25 ноября 2008

Принимая ответ Кабоинга и отредактированный вопрос, решение выглядит так:

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 голос
/ 25 ноября 2008

взгляните на tabeldiff.exe , который поставляется с сервером sql.

1 голос
/ 24 ноября 2008

Вам нужно взглянуть на предложение EXCEPT . Он является новым для SQL SERVER 2005 и делает то же самое, что и Oracle MINUS.

SQL1 КРОМЕ SQL2

выдаст вам все строки в SQL1, которых нет в SQL2 IF

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

результат A, D

1 голос
/ 24 ноября 2008

Опираясь на ответ Габриэля 1836, он стал проще, но, возможно, немного сложнее для интерпретации:

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
0 голосов
/ 24 ноября 2008

Попробуйте следующее:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...