| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2801 人关注过本帖
标题:怎样取表里的第N条记录啊?
只看楼主 加入收藏
tjztjz
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-11-8
收藏
 问题点数:0 回复次数:5 
怎样取表里的第N条记录啊?

怎样取表里的第N条记录啊?论坛里的方法不对啊!

查询第xxx行数据

假设id是主键:
select *
from (select top xxx * from yourtable) aa
where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id)

出来的是空表

搜索更多相关主题的帖子: 表里 记录 select yourtable top 
2006-09-02 23:19
tjztjz
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-11-8
收藏
得分:0 
论坛里的另一个方法

"你没仔细看那帖子。
那是一个过程。
你要的在里面一部分。
select * from tablename
where (select top 1 * from tablename ) not in (select top 2 * from tablename)
就可以得到第3行的数据了。"

也没有用
2006-09-02 23:27
小水滴
Rank: 1
等 级:新手上路
威 望:2
帖 子:227
专家分:0
注 册:2006-8-22
收藏
得分:0 

我看过一篇SQL的资料,资料中这样说:


本章的介绍中曾强调过,SQL表没有内在的顺序。例如,从一个表中取第二个记录是没有意义的。从SQL的角度看来,没有一个记录在任何其他记录之前。

然而,你可以操纵一个SQL查询结果的顺序。在缺省情况下,当记录从表中取出时,记录不以特定的顺序出现。

--------------------------------------

我觉得如果要取第n条记录,应该先排序,问题是排过序的表,你怎么知道要找的记录在第几条的位置?


2006-09-03 09:27
tjztjz
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-11-8
收藏
得分:0 

谢谢你了

2006-09-03 22:56
卜酷塔
Rank: 7Rank: 7Rank: 7
来 自:魅力青岛
等 级:禁止访问
威 望:39
帖 子:2569
专家分:0
注 册:2004-6-12
收藏
得分:0 
在对SQL数据库表的操作中。。。经常会遇到要获取表中第n行数据的问题。。。(我是经常遇到)
而且那些表大都有自增字段。但是中间就是却胳膊少腿的少了某些数据。。。
所以不能用自增字段简单来判断。。。。
那时不懂就上网查。。。‘百毒’和‘狗狗’出现了一大堆结果。但大都没用或者模糊。。。
下面把我自己奋斗的过程。。。与大家分享。。。希望能帮到人。。。
注:高手别见笑。
同时也希望能分享更好的方法。。。谢谢支持!!!
----
首先。我们知道。
如果要查询 前 2行的话。只需select top 2 字段名1 from tablename
如果要查询 前 3行的话。只需select top 3 字段名1 from tablename
那么要查询 第 3行的话。就可以这样做:
select 字段名1 from tablename
where (select top 3 字段名1 from tablename ) not in (select top 2 字段名1 from tablename)
----
自然的,当我们想查询第n行的时候,是否只需要把对应的3改为n,把2改为n-1呢?
但是select top n from tablename 语句对n的要求是n必须是确定的数值才可以!
所以如果这样写的话那肯定就会报错:
declare @i int,@j int
set @i=1
set @j=@i-1
select 字段名1 from tablename
where (select top @i 字段名1 from tablename ) not in (select top @j 字段名1 from tablename)
------------------
那么应该怎样才不会报错呢?
这里要用到exec()。。。

declare @i int
declare @j int
set @i=13
set @j=@i-1
exec(' declare @c char(20) '+' select @c=字段名1 from jw_xsb where 字段名1 in (select top '+ @i+ ' 字段名1 from jw_xsb)
and 字段名1 not in (select top ' +@j+ ' xh from jw_xsb) '+' select @c')
这样就可以获得对应第I行的数据的 字段名1了。
但是@c是定义在里面的。在外面如果直接用:
update tablename2
set 字段名2=tablename2.字段名2
where 字段名1=@c
这样就会报错说没定义变量@c
所以用之前得先把@c从里面output出来

所以用下面的好点。。。。
这是给数据排号的程序。。。
declare @d int, @e int, @f int, @g int, @n int, @k int,@m nvarchar(800)
set @d=1
set @e=@d-1
set @k=10001
set @g=(select count(xh) from tablename)
set @n=1
while @n<=@g
begin
set @m=N'select @f=字段名1 from ( select top ' + cast( @d as varchar)+ ' 字段名1 from tablenameorder by 字段名3)
m where m.字段名1 not in ( select top '+ cast(@e as char)+ ' 字段名1 from tablename order by 字段名3) '
---------注意对应的空格哦
EXECUTE SP_EXECUTESQL @m,N'@f int output',@f output
update tablename
set 字段名2=@k
where( 字段名1=@f)
set @k=@k+1
set @n=@n+1
set @d=@d+1
end
这种方法在此告一段落。。。。。已经能够达到我们想要的功能了。。。。。
只是这种方法有个弊端。
就是循环里面用到SQL语句的话。
会影响到速度。
做了下简单测试。
循环更新1000条数据的两个字段。
普通循环用时1.1秒
上面所说的循环用时3.7秒
主:不用游标是因为游标更慢

觉得为时已晚的时候,恰恰是最早的时候。

2006-09-04 09:16
kitter520
Rank: 1
等 级:新手上路
威 望:1
帖 子:21
专家分:0
注 册:2006-9-1
收藏
得分:0 

n 為要取的字段

select *
from (select top n * from students) aa
where not exists(select * from (select top n-1 * from students) bb where aa.id=bb.id)
能行﹗

[此贴子已经被作者于2006-9-4 14:44:47编辑过]

2006-09-04 14:34
快速回复:怎样取表里的第N条记录啊?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036793 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved