2011-07-22 26 views
5

私は古いバージョンのSQLクエリを新しいバージョンに置き換えています。なぜなら、いくつかの行が含まれていなかったからです。大規模な2つのSQLクエリの比較

新しいクエリは確かにこれらの欠落行が含まれていますが、私はそれはまた、元のクエリからすべての行が含まれていることを完全に確認したいです。

2つのクエリは全く異なるテーブルを使用します。各クエリは〜14000行です。

はQueryAがQueryBが持っていない任意の行を含むかどうかをチェックし、私は書くことができますクエリがありますか?両方のクエリが同じテーブルの主キー列を返すと仮定すると、

+0

主キーの列は何ですか?各クエリのどのフィールドが各行に固有であるか。 –

+0

申し訳ありません。両方のクエリは1つのフィールドのみを返します。明らかに、それは両方で同じ名前になっています。このフィールドには重複する値は含まれません。 – Urbycoz

答えて

9

あなたはこのような何かを行うことができます。

Select * FROM 
(
QUERY A GOES HERE 
) AS A 
LEFT JOIN 
(
QUERY B GOES HERE 
) AS B 
ON A.Col1=B.Col1 AND A.Col2=B.Col2 .... 
WHERE B.Col1 IS NULL 

あなたは「句の」内のすべての列を含めることができますいずれか、またはあなたがちょうどあなたが行を確保するために必要な列を含めることができますが、このような主キーとして、同じです。

+0

これは完璧です。ありがとうございました! – Urbycoz

2

select * 
from (QueryA) a 
where a.PK not in (select PK from (QueryB) b) 

は括弧が、これらはサブクエリであることを意味しますのでご注意ください。

+0

複雑なクエリでは、結果セットに単一のフィールド一意の識別子がある可能性は低いです。 – MatBailie

+0

それは本当ではないとは限りません。 –

+1

また、両方向を比較する必要があります。 'QueryB'に' QueryA'がないという結果があったらどうなりますか?これは例外を表示しません。 – JNK

1
  1. 一時テーブルに古いクエリの結果を選択します。
  2. 新しいクエリの結果を別の一時テーブルに選択します。
  3. 外側の表を一方の表から他方の表に結合し、すべての列を等価にします。
  4. 一方の側または他方の側にヌルがある行だけを返すために、where句を追加します。例えば

、結果は(理論的に)ように見えた場合:

UserId | FirstName | LastName | Email 

その後は同じ構造を有する別個の一時テーブルに各クエリを実行し、#resOld及び「#resNew」を言います。その後

SELECT 
    * 

FROM #resOld OLD 

LEFT OUTER JOIN #redNew NEW -- LEFT OUTER JOIN, so we still retain rows which don't match 
    ON NEW.UserId = OLD.UserId 
    AND NEW.FirstName = OLD.FirstName 
    AND NEW.LastName = OLD.LastName 
    AND NEW.Email  = OLD.Email 

WHERE OLD.UserID IS NULL -- Only retain rows where we didn't match. Can use any field from OLD which cannot be null by design. 

他の行と一致しない設定1つの結果から行がある場合は、このクエリは行のみが返されます。

EDIT:それは必要以上に複雑です、あなただけの参加基準を反転し、そのようにWHEREを削除することができます

SELECT 
    * 

FROM #resOld OLD 

INNER JOIN #redNew NEW -- Inner join where rows are different. 
    ON NEW.UserId != OLD.UserId 
    AND NEW.FirstName != OLD.FirstName 
    AND NEW.LastName != OLD.LastName 
    AND NEW.Email  != OLD.Email 
1

あなたはLEFT OUTER JOINを使用してもらえますか?

SELECT 
    * 
FROM 
    (< put query 1 here >) AS Query1 
LEFT JOIN 
    (< put query 2 here >) AS Query2 
    ON Query1.Field1 = Query2.Field1 
    AND Query1.Field2 = Query2.Field2 
    AND Query1.Field3 = Query2.Field3 
    etc, etc 
WHERE 
    Query2.Field1 IS NULL 
1

あなたはSQL Serverにそれを得ることができるしている場合は、あなただけで行うことができます:他のクエリには存在しません

<Query 1> 
EXCEPT 
<Query 2> 

<Query 2> 
EXCEPT 
<Query 1> 

この意志だけ出力レコードを。結果セットのすべてのフィールドをチェックします。

EXCEPTステートメントの下部にさらにレコードがある場合は例外として表示されないため、両方向が含まれています。

関連する問題