2016-04-20 6 views
1

Есть несколько подобных потоков за эти годы, но я не нашел или не смог сделать то, что ищу.SQL Server: список различий между таблицами

В настоящее время у меня есть две таблицы, которые имеют одну и ту же схему, которую я создаю через скрипт. Назовите имя «results_prior», а другое - «results_current». Этот новый запрос будет идеально работать один раз в месяц и обнаруживать, есть ли какие-либо различия. Пример:

ТАБЛИЦА: results_prior

---------------------------------------- 
| ID | ENVIRONMENT | EDITION | CONTACT | 
---------------------------------------- 
| 03 | Development | 2008 | Bob  | 
---------------------------------------- 
| 05 | Production | 2012 | Phil | 
---------------------------------------- 
| 09 | Development | 2008 | Erik | 
---------------------------------------- 
| 13 | Production | 2012 | Ashley | 
---------------------------------------- 
| 22 | Production | 2012 | Erik | 
---------------------------------------- 

ТАБЛИЦА: results_current

---------------------------------------- 
| ID | ENVIRONMENT | EDITION | CONTACT | 
---------------------------------------- 
| 03 | Development | 2008 | Bob  | 
---------------------------------------- 
| 05 | Production | 2012 | Phil | 
---------------------------------------- 
| 22 | Production | 2012 | Erik | 
---------------------------------------- 

Когда два сравниваются, результат должен быть:

---------------------------------------- 
| ID | ENVIRONMENT | EDITION | CONTACT | 
---------------------------------------- 
| 09 | Development | 2008 | Erik | 
---------------------------------------- 
| 13 | Production | 2012 | Ashley | 
---------------------------------------- 

Так как 09 и 13 были в results_current. Аналогично, и это, пожалуй, сложная часть, это то же самое делать, если results_current имеет больше результатов, чем results_prior. Итак, наоборот.

Извините, у меня нет кода для примера. Я работаю с UNION, JOINs и ЗА ИСКЛЮЧЕНИЕМ последние несколько часов, и я чувствую, что моя логика (опять же, в SQL Server) просто не имеет никакого смысла. Любая помощь будет оценена.

ответ

0

Я хотел бы попробовать что-то примерно похожее на это:

SELECT ID, ENVIRONMENT, EDITION, CONTACT FROM RESULTS_PRIOR 
WHERE ID NOT IN (SELECT ID FROM RESULTS_CURRENT) 
UNION 
SELECT ID, ENVIRONMENT, EDITION, CONTACT FROM RESULTS_CURRENT 
WHERE ID NOT IN (SELECT ID FROM RESULTS_PRIOR) 
+0

Я бы сделать что-то подобное, но я бы заменить «НЕ СУЩЕСТВУЕТ» для «NOT IN» пункта. NOT EXISTS работает как оператор cut, поэтому при первом успехе он остановится и не будет оценивать больше строк для этого контекста. –

+0

Отличные ответы на мой вопрос. Однако это тот, который дает мне результаты без необходимости прыгать через многие обручи. Я также заменил все столбцы на * и смог получить тот же результат. Что может быть полезно в случае добавления всех столбцов/полей по дороге. – Erik

3

Это может рассматриваться как набор результатов A-B union B-A. Я предполагаю, что все столбцы одинаковы в обеих таблицах. Хватит * в select.

(select * from results_prior 
except 
select * from results_current) 
union all 
(select * from results_current 
except 
select * from results_prior) 
Смежные вопросы