我想返回前x行,但还需要选择的项目总数。在MSSQL中,我发现了问题,但是在Interbase中却没有找到解决方案。
Firebird是否也存在这种说法?
还有一个普遍的问题,这种嵌入式函数(同样在MSSQL中)实际上比执行第二条语句以获得总行数更快吗?
答案 0 :(得分:2)
您需要两个单独的请求。
一种方法是接收使用兼容SQL的offset
和fetch
从Firebird 3或rows
子句或first
和skip
开始的有限行集:< / 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;