SQL Server:列出表之间的差异

时间:2016-04-20 20:32:55

标签: sql sql-server database report relational-database

这些年来有一些类似的线索,但我没有找到或能够做我正在寻找的东西。

我目前有两个表具有通过脚本生成的相同模式。出于名字的缘故,一个是“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,JOIN和EXCEPT,我觉得我的逻辑(再次,在SQL Server中)没有任何意义。任何帮助将不胜感激。

2 个答案:

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

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