从查询中选择FIRST X,但获得计数(例如用于分页)

时间:2019-01-19 18:39:24

标签: sql firebird

我想返回前x行,但还需要选择的项目总数。在MSSQL中,我发现了问题,但是在Interbase中却没有找到解决方案。

Firebird是否也存在这种说法?

还有一个普遍的问题,这种嵌入式函数(同样在MSSQL中)实际上比执行第二条语句以获得总行数更快吗?

3 个答案:

答案 0 :(得分:2)

您需要两个单独的请求。

一种方法是接收使用兼容SQL的offsetfetch从Firebird 3或rows子句或firstskip开始的有限行集:< / p>

select field1, field2
from mytable
[where conditions]
[offset 0 rows] fetch first 10 rows only

另一个是要接收总记录数:

select count(*) from mytable [where conditions]

请注意,对于复杂的查询和/或大量的数据,最后一次查询可能会很昂贵。通常在大量数据上使用其他方法。一种是专用的FTS引擎,例如SphinxSearch。 例如,谷歌为您提供近似的结果计数。

答案 1 :(得分:0)

如果您使用的是Firebird 3,则可以使用window functions

select count(*) over(), column1, column2, etc
from sometable
where somecondition
order by something
fetch first 10 rows only

这使用了Firebird 3中引入的fetch clause

在较早的版本中,这样做要困难一些,但是例如在Firebird 2.1和更高版本中,可以使用公用表表达式来避免重复查询和条件:

with actualquery as (
  select column1, column2, etc
  from sometable
  where somecondition
)
select (select count(*) from actualquery), column1, column2, etc
from actualquery
order by something
rows 10

这使用了rows clause(类似于select first 10

答案 2 :(得分:-1)

适用于 Firebird 2.5

with query as (
    select * from RDB$RELATION_FIELDS where RDB$RELATION_NAME = 'RDB$RELATIONS' order by 1
) select 
    RDB$GET_CONTEXT('USER_TRANSACTION', current_timestamp) as "__count__",
    query.*
from query
where 
    coalesce(
        RDB$GET_CONTEXT('USER_TRANSACTION', current_timestamp), 
        (select RDB$SET_CONTEXT('USER_TRANSACTION', current_timestamp, count(*)) from query)
    ) is not null
rows 6 to 10;