求教SQL语句

Adebayor 2009-04-16 12:14:49
在Oracle数据库中
如:user表
ID Name
1 A
4 B
7 C
2 D
5 E
8 F
其中ID是主键,如何先按照ID排序,再检索出第四条到第六条之间的数据?
...全文
205 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sixufan 2009-04-20
  • 打赏
  • 举报
回复
路过学习!
lqb2008 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kkdelta 的回复:]
如果是“top N”的问题
SELECT * FROM (SELECT × from user order by id) where rownum <N;
第四条到第六条之间的数据:
select *
from (select id,name,row_number() over(order by id) rn
from user) t
where t.rn>=4 and t.rn <=6
[/Quote]
这个才是楼主要得到的结果吧!
  • 打赏
  • 举报
回复
今天看到这感觉有趣,我的oracle 10G 不能将*与rownum连用,用下面语句能得到楼主期待的数据:
SELECT ID,NAME FROM(select ROWNUM R,ID,NAME from (select * from users order by id)) WHERE R<=6
AND R>=4;
superhsj 2009-04-17
  • 打赏
  • 举报
回复
1、2、5楼应该都是正确的
Adebayor 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 Adebayor 的帖子:]
在Oracle数据库中
如:user表
ID Name
1  A
4  B
7  C
2  D
5  E
8  F
其中ID是主键,如何先按照ID排序,再检索出第四条到第六条之间的数据?

[/Quote]
大家都有自己的想法 我这边真的是不知道到底哪个是真确答案了
希望哪位好心人 帮帮忙 按照我的表 执行下!
我这oracle正在下载中 没法试验 希望可以快点找到正确答案 然后结贴散分!
superhsj 2009-04-17
  • 打赏
  • 举报
回复
ls明显没有测试
SQL> create table test (id number,val varchar2(10));

表已创建。

SQL> insert into test values(1,'val1');

已创建 1 行。

SQL> insert into test values(2,'val2');

已创建 1 行。

SQL> insert into test values(3,'val3');

已创建 1 行。

SQL> insert into test values(3,'valxxx3');

已创建 1 行。

SQL> insert into test values(4,'val4');

已创建 1 行。

SQL> insert into test values(5,'val5');

已创建 1 行。

SQL> insert into test values(6,'val6');

已创建 1 行。

SQL> insert into test values(7,'val7');

已创建 1 行。

SQL> insert into test values(8,'val8');

已创建 1 行。

SQL> insert into test values(9,'val9');

已创建 1 行。

SQL> insert into test values(10,'val10');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from test order by id;

ID VAL
--------- --------------------
1 val1
2 val2
3 val3
3 valxxx3
4 val4
5 val5
6 val6
7 val7
8 val8
9 val9
10 val10

已选择11行。

SQL> select * from (
2 select id,val,rownum num from test order by id)t where t.num>=4 and t.num <=6
3 ;

ID VAL NUM
--------- -------------------- ---------
3 valxxx3 4
4 val4 5
5 val5 6

SQL>
IT农夫 2009-04-17
  • 打赏
  • 举报
回复
select * from (
select id,val,rownum num from test order by id)t where t.num>=4 and t.num <=6
这种写法是不对的
select * from test order by id:

ID VAL

1 val1
2 val2
3 val3
3 valxxx3
4 val4
5 val5
6 val6
7 val7
8 val8
9 val9
10 val10

select * from (
select id,val,rownum num from test order by id)t where t.num>=4 and t.num <=6
得到的结果是:
ID VAL NUM

4 val4 4
5 val5 5
6 val6 6
应该是
3 valxxx3
4 val4
5 val5
才对啊
Adebayor 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hongqi162 的回复:]
select * from (select *,rownum num from user order by id) t where t.num>=4 and t.num <=6
[/Quote]
呵呵 我也是这么想的 不过这个肯定是不对的!
fuyou001 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hongqi162 的回复:]
select * from (select *,rownum num from user order by id) t where t.num>=4 and t.num <=6
[/Quote]
来晚了
djs00717 2009-04-16
  • 打赏
  • 举报
回复

select *
from (select id,Name ,row_number() over(order by id) rn
from basshp) t
where t.rn>=4 and t.rn<=6

hongqi162 2009-04-16
  • 打赏
  • 举报
回复
select * from (select *,rownum num from user order by id) t where t.num>=4 and t.num<=6
superhsj 2009-04-16
  • 打赏
  • 举报
回复
后面那种情况不会发生的select empno,rownum rn from scott.emp order by empno得到的数据室固定为:

EMPNO RN
---------- ----------
7369 1
7499 2
7521 3
7566 4
7654 5
7698 6
7782 7
7839 8
7844 9
7900 10
7902 11
7934 12

select * from (select empno,rownum rn from scott.emp order by empno) t
2 where t.rn between 4 and 6;
是从上面的结果中选4--6,不会出现别的情况

[Quote=引用 12 楼 Adebayor 的回复:]
SQL> select empno,rownum rn from scott.emp order by empno;

EMPNO RN
---------- ----------
7369 1
7499 2
7521 3
7566 4
7654 5
7698 6
7782 7
7839 8
7844 9
7900 10
7902 11
7934 12

匡…
[/Quote]
Adebayor 2009-04-16
  • 打赏
  • 举报
回复
SQL> select empno,rownum rn from scott.emp order by empno;

EMPNO RN
---------- ----------
7369 1
7499 2
7521 3
7566 4
7654 5
7698 6
7782 7
7839 8
7844 9
7900 10
7902 11
7934 12

匡 12 

SQL> select * from (select empno,rownum rn from scott.emp order by empno) t
2 where t.rn between 4 and 6;

EMPNO RN
---------- ----------
7566 4
7654 5
7698 6

SQL>
这个rownum显然是按顺序的
如果变成这样:
EMPNO RN
---------- ----------
7369 4
7499 5
7521 6
7566 1
7654 2
7698 3
7782 7
7839 8
7844 9
7900 10
7902 11
7934 12
你说得到的结果应该是前三条数据!!!!!!
Adebayor 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 Adebayor 的帖子:]
在Oracle数据库中
如:user表
ID Name
1  A
4  B
7  C
2  D
5  E
8  F
其中ID是主键,如何先按照ID排序,再检索出第四条到第六条之间的数据?

[/Quote]
先在此谢谢大家的帮忙
不过还是不明白 按理说数据结果集应该是:5,7,8.
user表中id为7的rownum=3 怎么会在4和6之间呢?
Raul_Gonzalez 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Adebayor 的回复:]
引用 1 楼 hongqi162 的回复:
select * from (select *,rownum num from user order by id) t where t.num>=4 and t.num <=6

呵呵  我也是这么想的  不过这个肯定是不对的!
[/Quote]

1楼的没问题
SQL> select * from scott.emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12る-80 800 20
7499 ALLEN SALESMAN 7698 20-2る -81 1600 300 30
7521 WARD SALESMAN 7698 22-2る -81 1250 500 30
7566 JONES MANAGER 7839 02-4る -81 2975 20
7654 MARTIN SALESMAN 7698 28-9る -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5る -81 2850 30
7782 CLARK MANAGER 7839 09-6る -81 2450 10
7839 KING PRESIDENT 17-11る-81 5000 10
7844 TURNER SALESMAN 7698 08-9る -81 1500 0 30
7900 JAMES CLERK 7698 03-12る-81 950 30
7902 FORD ANALYST 7566 03-12る-81 3000 20
7934 MILLER CLERK 7782 23-1る -82 1300 10

匡 12 

SQL> select empno,rownum rn from scott.emp order by empno;

EMPNO RN
---------- ----------
7369 1
7499 2
7521 3
7566 4
7654 5
7698 6
7782 7
7839 8
7844 9
7900 10
7902 11
7934 12

匡 12 

SQL> select * from (select empno,rownum rn from scott.emp order by empno) t
2 where t.rn between 4 and 6;

EMPNO RN
---------- ----------
7566 4
7654 5
7698 6

SQL>
superhsj 2009-04-16
  • 打赏
  • 举报
回复
1楼思路是正确的,直接执行有点问题,细节问题
select * from (select user.*,rownum num from user order by id) t where t.num>=4 and t.num <=6
阿三 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Adebayor 的回复:]
引用 1 楼 hongqi162 的回复:

select * from (select *,rownum num from user order by id) t where t.num>=4 and t.num <=6

呵呵  我也是这么想的  不过这个肯定是不对的!
[/Quote]

这个怎么不对呀,应该是对的呀
fafuhefan 2009-04-16
  • 打赏
  • 举报
回复
应该后面多加个t.* 吧
select t.* from (select *,rownum num from user order by id) t where t.num>=4 and t.num <=6
speedin 2009-04-16
  • 打赏
  • 举报
回复
顶,2楼和5楼是正确的。。1楼也应该是正确的。。。
IT农夫 2009-04-16
  • 打赏
  • 举报
回复
如果是“top N”的问题
SELECT * FROM (SELECT × from user order by id) where rownum <N;
第四条到第六条之间的数据:
select *
from (select id,name,row_number() over(order by id) rn
from user) t
where t.rn>=4 and t.rn<=6

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧