2017-05-16 7 views
-2

INよりもEXISTSを使用するクエリを記述する必要があるため、高速に実行されます。フィルタには、EXISTSが唯一のオプションのように見えるほど多くのパラメータ値が入力されています。違いは、20 +分のクエリと5秒のクエリの間にあります。フィルタのEXISTSが多すぎる値を返す

これは私が持っているクエリです:

SELECT DISTINCT d.GROUP_NAME 
FROM [EMPLOYEE] e JOIN [DATA_FACT] d ON (e.KEY = d.KEY) 
WHERE d.DATE BETWEEN @Start and @End 
AND EXISTS 
(    
    select '1234567' -- @ID 
) 
AND e.Location IN (@Location) 
ORDER BY d.GROUP_NAME ASC 

問題は、それはあまりにも多くのレコードを返しているということです。私はフィルタリングする渡している値に基づいて、私は戻って1行を取得する必要がありますが、代わりに、私は28

を取得しています私はEXISTS削除した場合、私は私が必要とする1つのレコードの取得後、次の行を追加します。

AND e.ID IN ('1234567') 

正しい結果が得られるように、EXISTSで動作するようにクエリを修正する方法はありますか?

+0

「1234567」はどこから来たのですか? –

+0

@ JoshPartの場合、値はSSRSからパラメータを介して取得されます。パラメータには多くの値があります。しかし、わかりやすくするために、上記のコードでパラメータを削除し、そのダミー値をハードコードした – Zolt

+2

Existsは通常、外部クエリを内部クエリに関連付けるために使用されます。チェックの条件がないため、現在のバージョンですべてのレコードが返されます。 –

答えて

0

これは、従業員表のパラメータによってdata_fact表をフィルタリングするために存在を使用しようとしている場合に基本的に必要なものです。膨大な数の従業員IDを投げた場合でも、パフォーマンスをどれだけ向上させるかはわかりません。

SELECT 
    d.GROUP_NAME 
FROM [DATA_FACT] AS d 
WHERE d.DATE BETWEEN @Start and @End 
AND EXISTS 
(    
    select 1 
    from EMPLOYEE AS e 
    WHERE d.[KEY] = e.[KEY] 
     AND e.[Location] IN (@Location) 
     AND e.ID IN ('1234567') 
) 
ORDER BY d.GROUP_NAME ASC 
+0

この提案された回答をお寄せいただきありがとうございますが、問題はまだサブクエリに 'AND e.ID IN( '1234567')'があることです。これにより、クエリが再び遅くなります。私の希望は、INの代わりにEXISTSを使用して、より速く実行させることでした。 – Zolt

+0

INの代わりにEXISTSを使用することはできず、まったく異なる機能を実行します。 INは、各レコードの変数を別のリストと照合してチェックします。EXISTSは条件の存在をチェックします。昨日からの元の質問にはとても良い答えがありました。あなたは、答えを読んで根本的な問題を学ぶ時間を取らずに、同じ質問を絶えず再投稿するのではなく、SQLで自分自身を教育する時間を費やす必要があります –

関連する問題