2012-05-10 3 views
0

他の多くの助けを借りて、テーブルのレコード間のマイナス(+または - )の差を計算するこのSQL文があります。問題は、計算された値に基準(> 0)を追加すると、クエリが大幅に遅くなることです。他のフィールドに基準を追加すると、予想どおりに動作します(長い遅延はありません)。条件を追加した後に遅く実行されるクエリ

SELECT T1.Date, 
     T1.Route, 
     T1.BookingID, 
     T1.StreetNumber, 
     T1.Street, 
     T1.Arrive, 
     T1.Perform, 
     T1.Miles, 
     T1.Miles - (SELECT Miles 
        FROM Test1 AS T2 
        WHERE T2.Route = T1.Route 
          AND T2.IDNumber = (SELECT Min(IDNumber) 
              FROM Test1 AS T3 
              WHERE T3.Route = T1.Route 
                AND T3.IDNumber > 
                 T1.IDNumber)) AS 
     Difference 
FROM Test1 AS T1 
GROUP BY T1.Date, 
      T1.Route, 
      T1.BookingID, 
      T1.StreetNumber, 
      T1.Street, 
      T1.Arrive, 
      T1.Perform, 
      T1.Miles, 
      T1.IdNumber, 
      T1.Status, 
      T1.Activityy 
HAVING ((([T1].[Miles] - (SELECT Miles 
          FROM Test1 AS T2 
          WHERE T2.Route = T1.Route 
            AND T2.IDNumber = (SELECT Min(IDNumber) 
                 FROM Test1 AS T3 
                 WHERE T3.Route = T1.Route 
                  AND T3.IDNumber > 
                T1.IDNumber))) > 0)) 
ORDER BY T1.IdNumber; 
+4

どのDBを使用していますか?鉛と遅れのソリューションは、DBに特定することができます –

+1

Egadは醜いクエリです! +1 @ConradFrix – Amadan

+0

あなたのクエリは、二重ネストされたcorelatedサブクエリのためにパフォーマンスが低下することになります。 – Bohemian

答えて

0

あなたの違いは、次のレコードをマイルで見つけることです。

データベースでrow_number()またはlag()がサポートされている場合は、複数の自己結合ではなくウィンドウ関数を使用してこのクエリを書き換えることができます。それはパフォーマンスの問題を修正するはずです。

それ以外の場合は、結合が「from」句に含まれるようにクエリを書き換えます。それも問題を解決するはずです。

最後に、テンポラリ・テーブルを使用する場合は、すべての結果をテンポラリ・テーブルに入れ、その後で選択します。 (これは私が推奨する方法ではありませんが、1回限りのクエリの場合は最速の解決方法です)

+0

私はAccess 2010を使用していますが、各行には一意の連続番号(IDNumber)があります。クエリは、上記のレコードのマイルを比較し、その差を正数または負数のいずれかとして返します。私は> 0を使用して、負の数を持つすべてのレコードを除外し、連続フォームに正の数を持つレコードのみを表示します。 – Ordnance1

関連する問題