2017-05-17 22 views
4

0から9000000までの数字を生成したいと思います。Oracleでは、以下のコードを使用できます。 Sybase ASEでこれを行うにはどうすればよいですか?Sybase ASEレベルで同等の接続

これは、Oracleである:

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

のSybase ASEでこれを行うには?

テーブルが複雑になるように、1から9000000までの数字が必要なので、テーブルを作成してIDを追加することはできません。これを行うためのクエリはありますか?

+0

私の質問が明確でない場合、私は責任を負いませんよ?私は、マスターからの読み取りに権限を追加する必要があるものの – Moudiz

答えて

3

は、数字を生成するために使用することができるシステム・プロシージャがあります:sa_rowgenerator

あなたは行っている可能性:

SELECT row_num FROM sa_rowgenerator(1, 9000000); 

を私はすべてのSybase ASEを知らないので、私はGoogleで検索それとこの手順は、ASEで利用できないことが、代替が存在することを発見した:

SQLどこでもシステム・プロシージャ・sa_rowgenerator、sa_split_list、および sa_conn_infoはASEではサポートされていません。 ASEマスターデータベースが含ま テーブル、sa_rowgeneratorプロシージャ、またはSQL Anywhereの のdbo.row_generatorシステムテーブルと同様 方法で整数値を選択するために使用することができるspt_values、。

出典:Migrating SQL Anywhere database applications to ASE

この表spt_values含む整数の番号が非常に記載されていません。それはゴーストテーブルのようなものです。

は、私はあなたがこの試みを与えることを示唆している:

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

をしかし、あなたのデータベースシステムが爆発;-)

+0

はまた、https://sqldbpool.com/2010/12/15/master-spt_values-system-table/ –

+0

非常に良い答えを見ます – Moudiz

1

これはあなたにとってはうまくいくかもしれませんが、少し時間がかかります(しかし、部品で行うこともできます)。申し訳ありませんが、私は、ちょうど怒鳴るこれを行うための最善の方法を知らない:例えば

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を必要としないので、説明を良くする)。 私はここで走って、5百万に達するまで1分以上かかる。

1

900万(+1)の数字をどのように/どのように使用する予定ですか?

番号のストリームをクライアントに送り返すことが唯一の目的なら、クライアントアプリケーションに9mの数字を生成させるほうがはるかに効率的だと思います。


は、小さなテーブル(RMHのベース-10の例を参照)の一握りのデカルト積に基づいて単一のクエリを使用して数字のシーケンスを生成する多くの方法がありますが、これらのソリューションのすべてが必要です:

  • まず、全体のデカルト積が
  • その後のtempdbに内蔵されるように、全体のデカルト積は、(メモリおよびtempdb内)ソートする
  • のみ、クライアントに送り返され、所望の数である

このオーバーヘッドは、小さな数字セット(1〜10)または大きな数字セット(1〜9,000,000)を生成するかどうかにかかわらず、同じ「ジェネレータ」クエリに必要です。

明らかに、より効率的で、より軽量な方法を使用して、データサーバーのリソースを奪うのを防ぐ必要があります(たとえば、9,000,000の数値を生成しようとしている複数のユーザー/アプリケーションを想像してください...大量のtempdbスペースとcpuリソース... egad ... DBAからの怒った電子メール/電話コールを期待してください!)。


もう一つのアイデアが必要な数字...

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

を生成するためのループ構造を使用するだろう...と、これはtempdbのオーバーヘッドを排除する一方で、あなたはまだアップに使用するつもりです中規模のCPUリソースが900万回ループしています。追加のパフォーマンス・ヒットは、900万行の結果セットを生成するオーバーヘッドから来る可能性があります。特に、dataserverとクライアント・アプリケーションの間に流れるネットワーク・パケットの数が過剰になる可能性があります。

最終結果を単一の結果セットのように見せることでネットワークパケットの量を減らすことはできますが、これは上記のループ構成をストアドプロシージャに変換し、ループバックサーバーが定義されていることを確認し、前記プロキシを参照するプロキシ・テーブルと、プロキシ・テーブルを照会して、目的の数値セットを含む単一の結果セットのように見えるようにします。

は「もちろん、この時点で、我々は今だけのデータサーバを持っているいくつかのフープを介してジャンプしなければならなかった単一の結果セットとして、(多少効率的な方法で)一連の数字を生成します。


SYBASE/ASEは、一連の番号を生成することができるいくつかの他の手段があるかもしれません(例えば、ID列を持つテーブルを移入/作成)が、すべては、データサーバのいずれかa)の良いビットが必要になりますリソースまたはb)いくつかの複雑なコード(例えば、アプリケーション・コンテキスト機能、プラグイン、Javaコード)...そう、より効率的にクライアント/フロントエンドアプリケーションによって処理された何かをします。 Sybase IQでは

関連する問題