| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1136 人关注过本帖
标题:[经验][分享]用SQL语句动态获取表的第N行!
取消只看楼主 加入收藏
kkzjk
Rank: 1
等 级:新手上路
威 望:1
帖 子:78
专家分:0
注 册:2006-7-27
收藏
 问题点数:0 回复次数:1 
[经验][分享]用SQL语句动态获取表的第N行!

在对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-7-27 21:56:59编辑过]

搜索更多相关主题的帖子: SQL 语句 动态 经验 获取 
2006-07-27 20:34
kkzjk
Rank: 1
等 级:新手上路
威 望:1
帖 子:78
专家分:0
注 册:2006-7-27
收藏
得分:0 
在SQL2005中。
select top ...
支持参数,好办多了

苦尽甘来!
2006-11-27 10:53
快速回复:[经验][分享]用SQL语句动态获取表的第N行!
数据加载中...
 
   



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

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