0

谢谢你看这个。比我聪明的人会有这个答案,但我已经达到了我的极限。

我有三个单独的表格,并试图将它们相互比较以测试一些报告。这些表中的每一个都是从单独的搜索查询填充的临时表。它们都有一个可以链接它们的 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 的大量结果,因为比较两者都做。我可以在组或 where 子句中撤消此操作,但我不知道如何操作。有任何想法吗?

4

2 回答 2

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只过滤。

于 2015-10-19T18:27:05.660 回答
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 中的那些值……除非所有这些值都相同。

于 2015-10-19T19:01:14.163 回答