当前位置: 首页 > 知识库问答 >
问题:

赛贝斯ASE通过等效级别连接

蔚元明
2023-03-14

我想生成从0到9000000的数字。在Oracle中,我可以使用下面的代码。如何在赛贝斯ASE中做到这一点?

这是在甲骨文中:

SELECT level  Num
FROM DUAL
CONNECT BY LEVEL  <= 9000000
ORDER BY Num;

如何在Sybase ASE中实现这一点?

我不能创建一个表并添加一个标识,因为我需要从1到9000000的数字,所以一个表会很复杂。有查询可以做到这一点吗?

共有3个答案

靳高明
2023-03-14

你能提供一些关于你计划如何使用这些900万数字的细节吗?

如果唯一的目的是将数字流发送回客户端,那么在我看来,让客户端应用程序生成9m数字会更有效。

有许多方法可以使用单个查询生成数字序列,该查询基于少量较小表的笛卡尔积(参见RMH的base-10示例),但所有这些解决方案都需要:

  • 首先,整个笛卡尔的产品将被构建在Temdb中
  • 然后,对整个笛卡尔积进行排序(在内存中)
  • 然后才将所需的号码发送回客户端

无论是要生成一个小的数字集(1到10)还是一个大的数字集(1到9000000),同一个“生成器”查询都需要这种开销。

显然,需要使用一种更好、更高效、更轻量级的方法来避免占用数据服务器资源(例如,Imagine几个试图生成9000000个数字的用户/应用程序…所有这些都使用大量的tempdb空间和cpu资源…egad…期待DBA发来愤怒的电子邮件/电话!)。

另一个想法是使用循环结构来生成所需的数字...

declare @counter bigint, @max bigint
select @counter=0, @max=9000000
while @counter <= @max
begin
    select @counter
    select @counter=@counter+1
end

...虽然这将消除temdb的开销,但你仍然会900万次循环使用适量的cpu资源。额外的性能影响可能来自生成900万一行结果集的开销,特别是您可能会看到在数据服务器和客户端应用程序之间流动的网络数据包数量过多。

虽然我们可以通过使最终结果看起来像单个结果集来减少网络数据包的数量,但这需要将上述循环构造转换为一个存储过程,确保定义了一个环回服务器,然后创建一个代理表来引用所述过程;然后,您将查询代理表,以获得一个包含所需数字集的结果集。

当然,在这一点上,我们现在不得不跳过一些障碍,只是为了让数据服务器(以一种有点有效的方法)生成一系列数字作为一个单一的结果集。

Sybase/ASE可能还有其他一些方法可以生成一系列数字(例如,使用标识列创建/填充一个表),但所有这些都需要a)大量数据服务器资源,或b)一些复杂的代码(例如,应用程序上下文函数、插件java代码)。。。做一些可能由客户端/前端应用程序更有效地处理的事情。

终洛华
2023-03-14

这可能对你有用,但需要一点时间(但你可以部分完成)。抱歉,但我不知道最好的方法,只是大声喊道:

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(只是为了更好地解释)。我跑到这里,花了一分钟多的时间才完成,直到500万。

郎飞龙
2023-03-14

在Sybase IQ中,有一个系统过程可以用来生成数字:sa_rowgenerator

你本可以做到:

 SELECT row_num FROM sa_rowgenerator( 1, 9000000);

我根本不了解Sybase ASE,所以我在谷歌上搜索了一下,发现这个过程在ASE中不可用,但有一种替代方法:

ASE不支持SQLAnywhere系统过程sa_rowgenerator、sa_split_list和sa_conn_info。ASE主数据库包含一个表spt_values,可用于以类似于sa_rowgenerator过程或SQLAnywheredbo.row_generator系统表的方式SELECT整数值。

来源:将SQLAnywhere数据库应用程序迁移到ASE

这个表spt_values包含整数是令人难以置信的没有记录。就像一张幽灵桌。

我建议你试试这个:

select number 
FROM master.dbo.spt_values
WHERE number BETWEEN 0 AND 9000000

但如果你的数据库系统爆炸,我不负责;-)

 类似资料:
  • 似乎 WITH 仅在 Sybase SQL Anywhere 中受支持:http://dcx.sybase.com/1100/en/dbusage_en11/commontblexpr-s-5414852.html …但不在Sybase ASE中:( 有人可以建议Sybase ASE中是否存在等效的构造吗?还有其他方法可以实现东西而不是使用 WITH,但我们计划重新调整一些动态生成的 SQL 的用

  • 我在赛贝斯ASE 15.5中使用赛贝斯Central工具创建了几个表。我已经将列定义为主键(int数据类型),不知何故,该列也变成了标识。 现在,从赛贝斯中心,我无法从该列中删除标识,即使该表或任何引用的表中没有数据。 有人能帮忙吗?我不想使用Set IDENTITY_INSERT,我想从本专栏中完全删除标识行为。 谢啦

  • 全部的 这个标题几乎说明了一切。我在这里查看,但找不到任何有关模式的信息。 有人能帮我照个灯吗? 我知道MS SQL Server使用“schema.name”来引用数据库中的表,但对于Sybase我不确定。 蒂娅! 编辑: 我想我应该更具体一点。 我知道在MS SQL Server中可以修改表所有者,但您仍然可以通过“从sysobjects so、sysusers su、sys.tables t

  • 如何在Sybase ASE 15表格设置中删除列。 我尝试了一些,但没有用: 以及查看Sybase文档,它没有为我的问题提供解决方案。 数据库my_db未启用选择进入数据库选项。无法执行带有数据副本的ALTER TABLE。设置选择进入数据库选项并重新运行。

  • 我四处搜索,找到了一些有用的程序,例如: 但没人能帮我。我需要获得有关CPU、RAM、OS等的信息。有什么工具或程序可以帮助我吗?

  • Support for the Sybase database. The following table summarizes current support levels for database release versions. 数据库接口支持 The following dialect/DBAPI options are available. Please refer to individ