在Oracle的SQL查询中获取固定数量的行[重复]
Posted
技术标签:
【中文标题】在Oracle的SQL查询中获取固定数量的行[重复]【英文标题】:Fetch a fixed number of rows in SQL query in Oracle [duplicate] 【发布时间】:2014-09-10 11:04:02 【问题描述】:请帮我在 Oracle 数据库中编写一个 SQL 查询。有一个名为 tbl 的表,它有 12 行。我想先选择前 4 行,然后选择下 4 行和最后 4 行。
任何人都可以告诉我如何在 Informix 中执行此操作。
【问题讨论】:
【参考方案1】:编辑:现在应该用 3 级选择修复:
select * from (
select q1.*, rownum as rn from ( --get correct rownum
select * from tbl order by column --get correct order
) q1
) q2
where q2.rn between 1 and 4; -- filter
第一部分。
第二部分和第三部分:
where q2.rn between 5 and 8
where q2.rn between 9 and 12
【讨论】:
在您的情况下,rownum between 5 and 8
和 rownum between 9 and 12
将不起作用,因为大于正整数的值始终为 false,如 Oracle document 中所述
@vasja- yammy 是对的。它不适用于第二部分和第三部分。
ROWNUM 不能这样工作。 ROWNUM 是一个伪列,它只有在 1 时才会进一步增加到 2。所以,当你说 rownum 在 5 和 8 之间时,ROWNUM 甚至不会增加,所以它永远不会返回任何行。它只会以这种方式工作:select * from(select rownum rn, val from order_test order by val) where rn between 5 and 8
@vasja- 是的,它也在工作
您可以简单地使用我在上面评论中发布的查询:-)【参考方案2】:
除非您明确指定 ORDER BY 然后选择所需的行,否则没有任何内容称为第一行、最后一行、“n”行。
Top-n Row Limiting 功能在病房Oracle 12c
:
SQL> select * from order_test order by val;
VAL
----------
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
10
20 rows selected.
前 4 行:
SQL> SELECT val
2 FROM order_test
3 ORDER BY VAL
4 FETCH FIRST 4 ROWS ONLY;
VAL
----------
1
1
2
2
接下来的 4 行(查看偏移量):
SQL> SELECT val
2 FROM order_test
3 ORDER BY VAL
4 OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
VAL
----------
3
3
4
4
最后,接下来的 4 行,OFFSET 8 行:
SQL> SELECT val
2 FROM order_test
3 ORDER BY VAL
4 OFFSET 8 ROWS FETCH NEXT 4 ROWS ONLY;
VAL
----------
5
5
6
6
【讨论】:
很高兴知道 12c 中有这样的功能! mysql 中有,现在 Oracle 有自己的 row Limiting Top N 查询功能。不用再担心和困惑 ROWNUM :-)【参考方案3】:你可以使用rownum
:
select * from (select t.*, rownum rn from tbl t) where rn between 1 and 4;
/
select * from (select t.*, rownum rn from tbl t) where rn between 5 and 8;
/
select * from (select t.*, rownum rn from tbl t) where rn between 9 and 12;
/
如果您使用order by
子句,请使用row_number()
(documentation)
select * from (select t.*, row_number() over (order by column_name) rn from tbl t) where rn between 1 and 4;
/
select * from (select t.*, row_number() over (order by column_name) rn from tbl t) where rn between 5 and 8;
/
select * from (select t.*, row_number() over (order by column_name) rn from tbl t) where rn between 9 and 12;
/
【讨论】:
@yammy- 谢谢,它对我有用。你能告诉我如何在上面的查询中放置 where 条件。 @AmitRaj 你的意思是where
用于结果过滤?您可以在where rn...
之后或在from tbl t where ...
之后的子查询中添加附加条件(我建议放入子查询中)以上是关于在Oracle的SQL查询中获取固定数量的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章
获取联系人在一分钟内有 20 个活动的行 - SQL 查询 [重复]
如何编写oracle SQL查询以特定顺序获取匹配和不匹配的行对(基于键列)