0

システム検証の一環として、2 つのクエリの結果を比較しようとしています (以下の単純化されたバージョン)。

-- Reference query, writing the criteria myself as part of the verification process
SELECT p.Id, p.FullName
FROM Person p
WHERE -- some criteria

-- Data Query, simply reading what my system under tests thinks of the same criteria
SELECT p.Id, p.FullName
FROM Person p
  RIGHT JOIN PersonsThatMatchCriteria pmc ON ...

それらが同じ結果を返すことを確認したいのですが、そうでない場合は、分析のためにそれらを表示したいと考えています。

((REFERENCE QUERY)
EXCEPT
(DATA QUERY))
  UNION
((DATA QUERY)
EXCEPT
(REFERENCE QUERY))

私のプロセスはツールと自動化が非常に貧弱であるため、これらのリクエストはほとんど手作業で入力しています。エラーが発生しやすいため、クエリを2回再入力/コピーアンドペーストする必要はありません。

質問は簡単です:次のようなものを書くことを可能にする簡単な構文 (または簡単なツール) はありますか?

(REFERENCE QUERY)
  XOR
(DATA QUERY)

うまく機能するハックを見つけましたが、それでも重いです。より良い(書きやすい)ものはありますか?

DECLARE @ShouldBeIncluded TABLE(Id INT); INSERT INTO @ShouldBeIncluded  
    SELECT p.Id, p.FullName
    FROM Person p
    WHERE ...

DECLARE @ActuallyIncluded TABLE(Id INT); INSERT INTO @ActuallyIncluded
    SELECT p.Id, p.FullName
    FROM Person p
      RIGHT J

SELECT p.Id, p.FullName
FROM Person p
WHERE p.Id IN (         SELECT Id FROM @ActuallyIncluded
                    EXCEPT  SELECT Id FROM @ShouldBeIncluded    )
    OR p.Id IN (            SELECT Id FROM @ShouldBeIncluded
                    EXCEPT  SELECT Id FROM @ActuallyIncluded    )
4

2 に答える 2

2

CTEを使用できます:

WITH ComplexQuery1(Col1, Col2) AS (
SELECT Col1, Col2
FROM ...
),
ComplexQuery2(Col1, Col2) AS (
SELECT Col1, Col2
FROM ...
),
Except1(Col1, Col2) AS(
SELECT * FROM ComplexQuery1
EXCEPT
SELECT * FROM ComplexQuery2
),
Except2(Col1, Col2) AS(
SELECT * FROM ComplexQuery2
EXCEPT
SELECT * FROM ComplexQuery1
)
SELECT * FROM Except1
UNION ALL
SELECT * FROM Except2;
于 2013-03-20T15:33:16.183 に答える
0

あなたの必要性を理解しているように、実際のクエリによって返されなかった予想される結果と、予想されなかった実際のクエリからの結果を表示することです。

私は 2 つのテーブルを使用します。最初のテーブルは期待されるデータを保持し、関心のあるすべての列のチェックサム値を含みます。2 番目のテーブルは実際のシステムでのクエリの結果であり、実行後に更新されるチェックサム列を含める必要があります。実際のクエリが実行されます。

以下の例を評価して、ニーズに合っているかどうかを確認してください。

declare @lt_ExpectedResults table (lER_PersonName varchar(20), lER_PersonStuff varchar(20), lER_Chksum bigint)
    Insert @lt_ExpectedResults  (lER_PersonName, lER_PersonStuff)
    Values   
    ('Bubba1','Stuf1'),
    ('Bubba2','stuff2')
    Update @lt_ExpectedResults set lER_Chksum = CHECKSUM(*)

    declare @lt_ActualResults table (lAR_PersonName varchar(20), lAR_PersonStuff varchar(20), lAR_Chksum bigint)
    Insert @lt_ActualResults   (lAR_PersonName, lAR_PersonStuff)
    Values
    ('Bubba1','Stuf1'),
    ('Bubba3','stuff2')
    Update @lt_ActualResults set lAR_Chksum = CHECKSUM(*)

    select * from @lt_ExpectedResults
    select * from @lt_ActualResults

    Select * from @lt_ExpectedResults
    full outer join @lt_ActualResults
    on lAR_Chksum = lER_Chksum
     where   lAR_Chksum is NULL or lER_Chksum is NULL

CHECKSUM 値が同一でないソース データから同一になる場合があることに注意してください。詳細については、StackOverflow とこのリンクを確認してください

チェックサム

于 2013-03-20T23:06:41.250 に答える