在对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<
=@gbegin
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=@kwhere(
字段名1=@f)
set @k=@k+1
set @n=@n+1
set @d=@d+1
end
这种方法在此告一段落。。。。。已经能够达到我们想要的功能了。。。。。
只是这种方法有个弊端。
就是循环里面用到SQL语句的话。
会影响到速度。
做了下简单测试。
循环更新1000条数据的两个字段。
普通循环用时1.1秒
上面所说的循环用时3.7秒
主:不用游标是因为游标更慢