2015-10-19 123 views
0

感謝您關注此問題。比我聰明的人會有這個答案,但我已經達到了我的極限。比較SQL表

我有三個單獨的表,我試圖比較它們對測試一些報告的目的。這些表中的每個表都是從單獨的搜索查詢填充的臨時表。他們都有一個可以鏈接它們的baseID。 例如

#1 
ID value 
1 5 
2 6 

#2 
ID value 
1 5 
2 7 

#3 
ID value 
1 5 
2 7 

我有以下查詢

 SELECT * FROM (SELECT * FROM #1 EXCEPT SELECT * FROM #2) AS T 
UNION ALL SELECT * FROM (SELECT * FROM #2 EXCEPT SELECT * FROM #1) AS T 
UNION ALL SELECT * FROM (SELECT * FROM #1 EXCEPT SELECT * FROM #3) AS T 
UNION ALL SELECT * FROM (SELECT * FROM #3 EXCEPT SELECT * FROM #1) AS T 
UNION ALL SELECT * FROM (SELECT * FROM #2 EXCEPT SELECT * FROM #3) AS T 
UNION ALL SELECT * FROM (SELECT * FROM #3 EXCEPT SELECT * FROM #2) AS T 

這一工程真的很好,比較三個表三者之間返回任何不同的值。只有一個缺失或不同的數據等,但是如果baseID出現多次,報告失敗。

#1 
ID value 
1 5 
1 6 
2 6 

#2 
ID value 
1 5 
1 6 
2 7 

#3 
ID value 
1 5 
1 6 
2 7 

在這個集合中,我得到了#1的大量結果,因爲比較是同時進行的。我可以在一個小組或哪個條款中解決這個問題,但我不知道如何。有任何想法嗎?

回答

1

你在程序世界中仍然想太多。試想想,更多的數據集做法:

SELECT  ID = COALESCE(t1.ID, t2.ID, t3.ID), 
      Value = COALESCE(t1.Value, t2.Value, t3.Value) 
FROM  #table1 t1 
FULL JOIN #table2 t2 ON t1.ID = t2.ID AND t1.Value = t2.Value 
FULL JOIN #table3 t3 ON (t1.ID = t3.ID AND t1.Value = t3.Value) 
         OR (t2.ID = t3.ID AND t2.Value = t3.Value) 
WHERE  t1.ID IS NULL OR t2.ID IS NULL OR t3.ID IS NULL 

這是比賽中3表中的每個記錄一起,在非比賽給NULL。由於您只對其他表中不存在的記錄感興趣,因此僅篩選NULL

0

如果你想避免因爲ID有重複值的乘積,嘗試這樣的事情:

SELECT ID, 
     MIN(V1) AS MINV1, 
     MAX(V1) AS MAXV1, 
     MIN(V2) AS MINV2, 
     MAX(V2) AS MAXV2, 
     MIN(V3) AS MINV3, 
     MAX(V3) AS MAXV3 
FROM (
     SELECT ID, VALUE AS V1, NULL AS V2, NULL AS V3 FROM #1 
     UNION 
     SELECT ID, NULL, VALUE, NULL FROM #2 
     UNION 
     SELECT ID, NULL, NULL, VALUE FROM #3 
     ) 
GROUP BY ID 
HAVING MIN(V1) <> MAX(v1) 
OR MIN(V1) <> MIN(V2) 
OR MIN(V1) <> MAX(V2) 
OR MIN(V1) <> MIN(V3) 
OR MIN(V1) <> MAX(V3) 
OR MIN(V1) IS NULL 
OR MAX(V1) IS NULL 
OR MIN(V2) IS NULL 
OR MAX(V2) IS NULL 
OR MIN(V3) IS NULL 
OR MAX(V3) IS NULL 

這將使每ID最多一行,並給在表1中找到的兩個極值,那麼表2中的兩個極值,以及表3中的兩個極值...... 只有當所有這些值都不相同時。