5

ユーザーの入力に一致する最初の 2 つのレコードと、データベース全体で一致するレコードの総数を返す関数を ColdFusion で作成しています。関数はオートコンプリートのフィードに使用されるため、速度/効率が最大の関心事です。たとえば、関数が input を受け取った場合、次を"bl"返す可能性があります。{sampleMatches:["blue", "blade", "blunt"], totalMatches:5000}

速度を上げるために単一のクエリでこれを実行しようとしましたが、最終的には次のようになりました。

select record, count(*) over ()
from table
where criteria like :criteria
and rownum <= :desiredCount

このソリューションの問題は、count(*) over ()常に の値を返すことです:desiredCountここで私のものと同様の質問を見ましたが、私のアプリには一時テーブルを作成する権限がありません。それで、1回のクエリで私の問題を解決する方法はありますか? それを解決するより良い方法はありますか?ありがとう!

4

2 に答える 2

5

私は頭の上でこれを書いているので、間違いなくこれを計る必要がありますが、次のCTEを使用すると信じています

  • 条件を一度だけ書く必要があります
  • 指定した量のレコードのみを返します
  • 各レコードに正しい合計数が追加されている
  • 一度だけ評価される

SQL ステートメント

WITH q AS (
  SELECT record
  FROM   table
  WHERE  criteria like :criteria
)
SELECT q1.*, q2.*
FROM   q q1
       CROSS JOIN (
         SELECT COUNT(*) FROM q
       ) q2
WHERE  rownum <= :desiredCount
于 2013-10-17T19:05:21.340 に答える