是否可以通过检查结果集计数来有条件“仅获取下一个X行”

问题描述 投票:0回答:2

我在.net框架(c#)中使用oracle客户端,需要限制返回的记录数,以防记录数大于X

构建 sql 时,我知道如果我首先执行查询来获取我正在构建的 sql 的计数,我可以附加

FETCH NEXT X ROWS ONLY
,如果计数超过 X,我可以附加
FETCH NEXT X ROWS ONLY
语句。

我很好奇是否有可能一次性实现这一目标,而不是获取计数并在计数超过x

时追加获取下一步
c# sql oracle plsql
2个回答
0
投票

您可以使用 ROWNUM 控制获取的行数...

WITH    --  S a m p l e    D a t a :
  tbl AS
    ( Select 'A' "DUMMY" From Dual Union All 
      Select 'B' From Dual Union All 
      Select 'C' From Dual Union All 
      Select 'D' From Dual Union All 
      Select 'E' From Dual Union All 
      Select 'F' From Dual 
    )

...只需注意 order by,因为它会影响获取行的顺序

Select  * From tbl Where  ROWNUM <= 3
/*  R e s u l t :
DUMMY
-----
A
B
C     */

...

Select * From  tbl Where ROWNUM <= 300
/*  R e s u l t :
DUMMY
-----
A
B
C     
D
E
F       */

0
投票

您似乎希望同时获取有限的行数和(未过滤的)行总数。在这种情况下,请在子查询中使用

COUNT(*) OVER ()
分析函数,然后限制行数:

SELECT *
FROM   (
  SELECT t.*,
         COUNT(*) OVER () AS num_rows
  FROM   table_name t
)
ORDER BY id
FETCH FIRST 5 ROWS ONLY

对于样本数据:

CREATE TABLE table_name (id, value) AS
SELECT LEVEL, CHR(64+LEVEL)
FROM DUAL
CONNECT BY LEVEL <= 10
ORDER BY DBMS_RANDOM.VALUE();

输出:

身份证 价值 NUM_ROWS
1 A 10
2 B 10
3 C 10
4 D 10
5 E 10

您仅获得 5 行,但您还获得一列,其中包含未过滤结果集中的总行数。

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.