我想生成0到9000000之间的数字。在Oracle中,我可以使用下面的代码。如何在Sybase ASE中执行此操作?
这是在Oracle中:
SELECT级别数来自双重按水平连接< = 9000000…
这可能适合你,但它需要一点时间(但你可以通过部分)。对不起,但我不知道最好的方法,只是下面的声音:
select * from (select (t6.i*1000000 + t5.i*100000 + t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_value from (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4, (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t5, (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t6) v where selected_value between 1 and 200 --here you can change the interval ex.: between 201 and 1000 order by selected_value
例如,如果您需要数字直到99999,那么您不需要t6和t5(只是为了更好地解释)。 我跑到这里,花了一分多钟才完成,直到五百万。
您能否详细说明您计划使用这些900万(+1)号码的内容/方式?
如果唯一的目的是将数字流发送回客户端,在我看来,让客户端应用程序生成9m数字会更有效率。
有许多方法可以使用基于少数几个较小表的笛卡尔积的单个查询生成一系列数字(参见RMH的基础10示例),但所有这些解决方案都需要:
无论您是要生成一小组数字(1到10)还是一组大数字(1到9,000,000),都需要相同“生成器”查询的开销。
显然,需要使用更好,更高效,更轻量级的方法来防止占用dataserver资源(例如,想象几个用户/应用程序试图生成9,000,000个数字......所有这些都使用大量的tempdb空间以及cpu资源...... 扯扯 ...期待来自DBA的愤怒的电子邮件/电话!)。
另一个想法是使用循环结构来生成所需的数字......
declare @counter bigint, @max bigint select @counter=0, @max=9000000 while @counter <= @max begin select @counter select @counter=@counter+1 end
...虽然这将消除tempdb开销,但你仍然会耗费900万次的适量cpu资源。产生900万个1行结果集的开销可能会带来额外的性能损失,特别是您可能会在数据服务器和客户端应用程序之间看到过多的网络数据包。
虽然我们可以通过使最终结果看起来像单个结果集来减少网络数据包的数量,但这需要将上面的循环结构转换为存储过程,确保定义了环回服务器,然后创建代理表到参考说proc;然后,您将查询代理表以获取包含所需数字集的单个结果集。
“当然,在这一点上,我们现在必须跳过一些箍,只是为了让dataserver生成(以一种有效的方法)一系列数字作为单个结果集。
可能有一些其他方法可以使Sybase / ASE生成一系列数字(例如,创建/填充带有标识列的表),但所有这些方法都需要a)一些数据服务器资源或b)一些复杂的代码(例如,应用程序上下文函数,插件java代码)...做一些可能由客户端/前端应用程序更有效地处理的事情。