sql - 有效地找到记录的子集以及总数

标签 sql oracle coldfusion

我正在 ColdFusion 中编写一个函数,该函数返回与用户输入匹配的前几条记录,以及整个数据库中匹配记录的总数。该函数将用于提供自动完成功能,因此速度/效率是其最关心的问题。例如,如果函数接收到输入 "bl" ,它可能会返回 {sampleMatches:["blue", "blade", "blunt"], totalMatches:5000}
出于速度目的,我尝试在单个查询中执行此操作,结果如下所示:

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

此解决方案的问题在于 count(*) over ()总是返回 :desiredCount 的值.我看到了一个与我类似的问题 here ,但我的应用程序将无权创建临时表。那么有没有办法在一个查询中解决我的问题?有没有更好的方法来解决它?谢谢!

最佳答案

我把这个写在我的头上,所以你一定要计时,但我相信使用以下 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
    

    关于sql - 有效地找到记录的子集以及总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19434949/

    相关文章:

    php - 如何在 Laravel 中获得最畅销的产品?

    java - Spring 连接池问题

    forms - 带括号的 ColdFusion 变量名称

    coldfusion - 找不到自定义标签的CFML模板

    MySql 文本本地化

    sql - Rails select() 和 count() 似乎不太好用

    sql - 用于 PL/SQL Oracle 函数或过程创建的 IS 与 AS 关键字

    sql - 选择另一个表的最小行

    coldfusion - 使用 CreateODBCDateTime() 创建的对象的返回类型是什么?

    mysql - 在 SQL 查询结果中将列值设置为列名