2015-10-19 126 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中的两个极值...... 只有当所有这些值都不相同时。