0

これを見てくれてありがとう。私より賢い人がこの答えを持っているでしょうが、私は限界に達しています。

3 つの個別のテーブルがあり、いくつかのレポートをテストする目的でそれらを相互に比較しようとしています。これらの各テーブルは、個別の検索クエリから入力される一時テーブルです。それらはすべて、それらをリンクする 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

これは、3 つのテーブルを比較して、3 つのテーブル間で異なる値を返すのに非常にうまく機能します。欠落しているデータや異なるデータが 1 つだけであるなどですが、レポートに 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 の膨大な量の結果が返されます。group または where 句でこれを元に戻すことができますが、方法がわかりません。何か案は?

4

2 に答える 2

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 行が与えられ、表 1 にある 2 つの極値、次に表 2 の 2 つの極値、および表 3 の 2 つの極値が得られます... これらの値がすべて同じではない場合に限ります。

于 2015-10-19T19:01:14.163 に答える