2013-02-22 23 views
5

SQL Serverの同等にOracleのクエリを変換する助けてください:SQL Serverの同等とLEVEL疑似

SELECT (LEVEL+1-1) AS lvl 
    FROM dual 
CONNECT BY LEVEL <= 10 
/

出力は1から10までの数字です:

LVL 
---- 
1 
2 
3 
... 
10 

私はそこにある知っていますSQL Serverの階層メソッド、およびGetLevelなどの組み込み関数これは同じ結果を得るために使用できますか?必要に応じて(わからない)デュアルテーブルを作成するには

- ここからコピー:http://blog.sqlauthority.com/2010/07/20/sql-server-select-from-dual-dual-equivalent/

CREATE TABLE DUAL 
(
DUMMY VARCHAR(1) 
) 
GO 
INSERT INTO DUAL (DUMMY) 
VALUES ('X') 
GO 

具体的に使用なめらかを聞かせ例を探しています。クエリのLEVELのように。たとえば、表には2013年4月22日の開始日が1つしかありません。しかし、LEVELでは次のようにそれを増やすことができます:

SELECT start_date, start_date+LEVEL-1 AS start_date_btwn 
    FROM my_tab 
WHERE id = 1 
CONNECT BY LEVEL<=10 
/

START_DATE START_DATE_BTWN 
------------------------------ 
4/22/2013 4/22/2013 
4/22/2013 4/23/2013 
4/22/2013 4/24/2013 
4/22/2013 4/25/2013 
...... 
4/22/2013 4/30/2013 

ありがとうございます。私は過去にそれをやった

+0

あなたが必要とする数の最大数はありますか? – sgeddes

+0

@sgeddes - いいえ、オラクルでは、私の例のように10の代わりに何か数を入れることができます。私は単純化のために私の例を10に制限しました。ありがとうございました。 – Art

+0

@マーティン - ありがとう。これは助けになりました。 – Art

答えて

9

一つの方法は、このようspt_valuesを照会している:

SELECT number 
FROM master..spt_values 
WHERE 
    type = 'P' 
    AND number <= 255 

しかし、それは数字の完全なリストを持っていません。代替オプションは、のような再帰CTEを作成するには、次のようになります。

WITH CTE AS (
    SELECT 1 as Number 
    UNION ALL 
    SELECT Number+1 
    FROM CTE 
    WHERE Number < 100 
) 
SELECT * FROM CTE 

SQL Fiddle Demo

+0

@ sgeddes-ありがとうございます。まだequivを探しています。 LEVEL疑似列に変換する。私はHierarchyメソッドの例も期待していました。 – Art

+0

@Art - 同等のものはレベル列には公開されていません(ただし、SQL Serverは最大再帰制限に達しているかどうかを内部的に追跡します)が、[ここの例のように]レベル列を追加するのは簡単です](http://msdn.microsoft.com/en-us/library/ms186243(v = sql.105).aspx) –

+0

@Martin - 素晴らしい例、ありがとうございます。 – Art

関連する問題