如何取表中间某个范围的数据

昨天工作需要生成了200多W行的数据,其实就是递增生成的,前面的文章有写过。这次范围不是连续的,比如电话号码段,可能是12340000-12350000,另一个范围就是22340000-22349999。一共200多个段,很2B的做法,手动分开连续的和不连续,然后使用之前的语句生成号码。我不会告诉你,我就是用这2B的做法的;但我可以告诉你后面有更2B的。

一共放了70多个excel工作表。结果要放到三个工作表里。只好在数据库中union all起来,再copy到excel工作表里,但excel一个工作表又不能放下200多W行,最多大概是104W多,这就是前面为什么要放三个工作表里的原因。

那如何用SQL生成分三部分呢?select top,是的!top只是放第一个工作表,第二第三呢?

SourceTable就一个字段,字段1

第一个语句:select top 1000000 * from  SourceTable;

第二个语句:

select top 2000000 * from SourceTable

except

select top 1000000 * from SourceTable

这个语句正确吗?“堆数据表是没有聚集索引的表。即数据行不按任何特殊的顺序存储,数据页也没有任何特殊的顺序”。改为下面的:

select * from

(select top 2000000 * from SourceTable order by 1)

except

select * from

(select top 1000000 * from SourceTable order by 1)

第三个语句:

select * from

(select top 总行数 * from SourceTable  order by 1)

except

select * from

(select top 2000000 * from SourceTable order by 1)

是不是很2啊,期间我还试过更2的,分享出来

select * from (select * from SourceTable order by 1)

幸好这个语句有报错,再重看那语句,自己都笑了。

正是因为这里用到except,所以上一篇才写except的去不去重复的问题。

关于从某表中取中间某些行的话题先放下;在返回到生成电话号码那话题

生成号码都可以用循环,有多少号码段为毛不能用循环啊?

1.把号码段导入数据库,HD;添加序号

select ROW_NUMBER() over (order by 号段) as xuhao, 号段 into HDU from HD;

2.循环中嵌套循环就OK了

declare @n numeric(8,0);
declare @i int;
        set @i=1;
while (@i<=5)
begin
    set @n = (select cast(号段+'0000' as numeric) from hdU where xuhao=@i);
while (@n <= (select cast(号段+'9999' as numeric) from hdU where xuhao=@i))
begin
insert into Haoma select @n
set @n = @n+1
end
set @i=@i+1
end
go
试了5个号段是没问题的。
就加一个xuhao的字段就方便多了,干嘛不用identity?非得用ROW_NUMBER()?
思维啊,这些天老是想窗口函数了。其实identity也是可以的。
今天和老大说关于取表中间行的问题,老大直接来了句,你加个id的字段就好了。对啊,取前多少行和中间多少行,在where条件里判断ID的范围就好了。恍然大悟啊,上面的identity替换窗口函数也是受这个影响。
 
思维啊!!!
posted @ 2014-06-05 14:53  cnmarkao  阅读(1018)  评论(1编辑  收藏  举报