【发布时间】:2014-09-10 11:04:02
【问题描述】:
请帮我在 Oracle 数据库中编写一个 SQL 查询。有一个名为 tbl 的表,它有 12 行。我想先选择前 4 行,然后选择下 4 行和最后 4 行。
任何人都可以告诉我如何在 Informix 中执行此操作。
【问题讨论】:
请帮我在 Oracle 数据库中编写一个 SQL 查询。有一个名为 tbl 的表,它有 12 行。我想先选择前 4 行,然后选择下 4 行和最后 4 行。
任何人都可以告诉我如何在 Informix 中执行此操作。
【问题讨论】:
编辑:现在应该用 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 中所述
select * from(select rownum rn, val from order_test order by val) where rn between 5 and 8
除非您明确指定 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
【讨论】:
你可以使用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;
/
【讨论】:
where 用于结果过滤?您可以在where rn... 之后或在from tbl t where ... 之后的子查询中添加附加条件(我建议放入子查询中)