标题:[经验][分享]用SQL语句动态获取表的第N行!
只看楼主
kkzjk
Rank: 1
等 级:新手上路
威 望:1
帖 子:78
专家分:0
注 册:2006-7-27
 问题点数:0 回复次数:4 
[经验][分享]用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
史前大暴龙
Rank: 1
等 级:新手上路
帖 子:375
专家分:0
注 册:2005-11-22
得分:0 

顶,不管有多长,我都看,楼主辛苦了


我不是最好,但我可以更好,大家一起加油了
2006-08-01 01:21
卜酷塔
Rank: 7Rank: 7Rank: 7
来 自:魅力青岛
等 级:禁止访问
威 望:39
帖 子:2569
专家分:0
注 册:2004-6-12
得分:0 
思路不错!

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

2006-08-01 10:07
kkzjk
Rank: 1
等 级:新手上路
威 望:1
帖 子:78
专家分:0
注 册:2006-7-27
得分:0 
在SQL2005中。
select top ...
支持参数,好办多了

苦尽甘来!
2006-11-27 10:53
bygg
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:乖乖的心中
等 级:版主
威 望:241
帖 子:13555
专家分:3076
注 册:2006-10-23
得分:0 
可以,支持。

飘过~~
2006-11-27 21:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-80642-1-1.html




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

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