1

いくつかの条件で 2 つのテーブルからデータを取得しようとしています。条件で内部結合を実行すると、巨大な値 (200000 データ) が得られます。しかし、グループ化すると、(8000 データ) のような非常に少ない値が得られます。

SELECT Tcg.SK_tID, Tcg.SK_ServiceProviderID
INTO #CHDetails 
FROM #ClientGroup Tcg           
INNER JOIN dbo.Component AS chd ON  chd.SK_PID = Tcg.SK_PID 
                                AND chd.SK_ServiceProviderID = Tcg.SK_ServiceProviderID
                                AND chd.SK_CompID = @CHD
                                AND chd.ReportDate < @ReportDate
GROUP BY Tcg.SK_PID ,Tcg.SK_ServiceProviderID

この原因を教えていただけないでしょうか。内部結合は常に共通データを取ります。#ClientGroup テーブルのデータは約 70000 ですが、dbo.Component のデータは非常に巨大です。共通の PID とサービス プロバイダーを論理的にクエリすると、#ClientGroup 以下のレコードが返されます。それはどのように多くを与えていますか?

グループ化すると 8000 になります。しかし、2 つのテーブルの内部結合でグループ化を行う必要があるのはなぜですか。

4

4 に答える 4

1

group by は基本的に、結果に対して個別の処理を実行しています。これを行う必要がある理由は、両方のテーブルに重複があるためです。

このsqlfiddleを参照してください:http://sqlfiddle.com/#!3/cbdca/2

その中で、table1 には 3 つの行があり、table2 には 3 つの行があります。結合すると、9 行が返されます。

于 2013-10-01T14:24:18.700 に答える
0

結合によって予想よりも多くのレコードが得られる場合は、結合基準が完全ではないことを意味します。これの極端なケースはデカルト結合です。

加入基準を確認してください。

于 2013-10-01T14:08:25.803 に答える
0

Group by は行を結合します。通常、集計データを生成するか、一意の値のリストを生成するために行われます。この例では、 #ClientGroup テーブルがグループ化され、返される行の総数が減少します。#ClientGroup よりも少ない行を取得する必要があります。

于 2013-10-01T14:46:46.020 に答える
0

INNER JOIN は DISTINCT を実行せず、代わりに INNER JOIN が両方のテーブルから一致するすべてのデータを検索するため、行数は減りません。

テーブル A とテーブル B があるとします。どちらにも列 ID があります。テーブル A には合計 3 つの行があり、すべての値が一意です。値は 1、2、3 です。TABLE B には合計 300 行ありますが、一意の値は 3 つしかありません。値は 1、2、3 です。(テーブル B には、一意の値ごとに 100 行あります)

この例では、テーブル A とテーブル B の間で INNER JOIN を実行すると、A のすべての行がテーブル B のすべての一致する行に結合されます。したがって、テーブル A の値 1 はテーブル B の 100 行と一致します テーブル A の値 2 はテーブル B の 100 行と一致します テーブル A の値 3 はテーブル B の 100 行と一致します

したがって、INNER 結合を実行すると、合計 300 行になります。

逆に、テーブル B の値が (1、2、3 以外の) 完全に異なる場合、INNER JOIN は結果を生成しません。

于 2013-10-01T20:07:25.183 に答える