2016-04-20 141 views
1

多年來有一些類似的線程關於這個,但我還沒有找到或能夠做我想要的。SQL Server:列出表之間的差異

我目前有兩張表,它們具有通過腳本生成的相同模式。出於名稱的原因,一個是「results_prior」,另一個是「results_current」。這個新的查詢將理想地每個月運行一次,並查找是否有任何差異。例如:

TABLE: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 | 
---------------------------------------- 

TABLE: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 EXISTS」爲「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)