1

私はこれらの2つのクエリの結果に驚いていました。私は両方から同じことを期待していました。共通のフィールドを共有する2つのテーブルがありますが、関係が設定されていません。テーブル(A)にはフィールドがEventID varchar(10)あり、テーブル(B)にはフィールドがありますXXNumber varchar(15)

テーブル列の値は、テーブルBXXNumberで参照されAますEventID。15文字を保持できますXXNumberが、179K行のデータはいずれも10文字より長くありません。

したがって、要件は次のとおりです。

「テーブルBとテーブルAのエントリの重複を避けるために、XXNumberがテーブルA>「イベントID」番号に含まれている場合は、カウントしないでください。」

このクエリを最初に実行した一般的なレコードの数を確認するには、クエリアルファと呼びます。」

SELECT dbo.TableB.XXNumber FROM dbo.TableB WHERE dbo.TableB.XXNumber in
  ( select distinct dbo.TableA.EventId FROM dbo.TableA )

結果は5322行でした。

次のクエリ-次のようなクエリデルタと呼びます。

SELECT DISTINCT dbo.TableB.XXNumber, dbo.TableB.EventId
FROM dbo.TableB INNER JOIN dbo.TableA ON dbo.TableB.XXNumber= dbo.TableB.EventId

haasは4308行を返しました。

結果の行数は同じではありませんか?

4

1 に答える 1

6

バージョンは、リスト内のそれぞれの個別の値にWHERE ID IN ()一致するすべての行を選択します(コードが内部選択を示しているかどうかに関係なく、それは関係ありません)。特定の値が親テーブルに複数回表示される場合、子テーブルで見つかったその単一の値に対して、親テーブルから選択された複数の行を取得します。DISTINCT

バージョンは、INNER JOIN結合が成功するたびに親テーブルから各行を1回選択するため、値を持つ子テーブルに3行、親に2行がある場合、その値の結果には6行の行があります。

それらを「同じ」にするには、メインセレクトに「DISTINCT」を追加します。

あなたが見ているものを説明するために、私たちはあなたの実際のデータについてもっと知る必要があるでしょう。

于 2013-02-04T23:57:45.913 に答える