1

件名のとおり - 遅い SQL IN ステートメントを INNER または LEFT JOIN に置き換えようとしています。私が取り除こうとしているもの:

SELECT 
    sum(VR.Weight) 
FROM 
    verticalresponses VR
WHERE RespondentID IN
(
    SELECT RespondentID FROM verticalstackedresponses VSR WHERE VSR.Question = 'Brand     Aware'
)

上記で置き換えてみました

SELECT 
    sum(VR.Weight) 
FROM 
    verticalresponses VR
    LEFT/INNER JOIN verticalstackedresponses VSR ON VSR.RespondentID = VR.RespondentID     AND VSR.Question = 'Brand Aware' 

残念ながら、私は異なる結果を得ています。誰でもその理由を理解できますか?可能であれば、仕事をより迅速に行うソリューションをアドバイスできますか? どうもありがとう!

4

3 に答える 3

2

サブクエリ

SELECT RespondentID FROM verticalstackedresponses VSR WHERE VSR.Question = 'Brand     Aware'

任意の RespondentID に対して複数の行を返す可能性がある場合、結合とバージョン間で異なる結果が得られます

これに沿った何かが同じ結果をもたらすかもしれません

SELECT 
    sum(VR.Weight) 
FROM 
    verticalresponses VR
JOIN(     SELECT distinct RespondentID FROM verticalstackedresponses 
          WHERE VSR.Question = 'Brand     Aware' 
    ) VSR
    ON  VSR.RespondentID = VR.RespondentID     
于 2013-06-10T11:40:32.417 に答える
1

問題は重複に関連している可能性があります。これを試して:

SELECT sum(VR.Weight) 
FROM verticalresponses VR inner join
     (select distinct RespondentID
      from verticalstackedresponses VSR
      where SR.Question = 'Brand Aware'
     ) vsr
     ON VSR.RespondentID = VR.RespondentID;

テーブルinner joinをフィルタリングしたいので、が必要です。VRAleft joinはすべてを最初のテーブルに保持します。

于 2013-06-10T11:41:44.403 に答える
1
  • JOIN は「等結合」であるため、行を乗算します。
  • IN (および EXISTS) は行を乗算しません。これは「半結合」であるためです。

いずれにせよ、おそらく適切なインデックスが必要です

  • 垂直応答、(RespondentID)
  • verticalstackedresponses、(質問、RespondentID)

詳細については、SQL ステートメントのサブクエリでの「IN」の使用を参照してください。

于 2013-06-10T11:40:32.757 に答える