2013-02-22 49 views
5

請幫助Oracle查詢轉換爲SQL Server的等價物:SQL服務器等同於甲骨文的CONNECT BY和水平虛列

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日。但是對於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 2013-02-22 19:37:06

+0

@sgeddes - 不,在Oracle中可以有任何數字而不是10,如我的例子。爲了簡化,我將示例限制爲10。謝謝。 – Art 2013-02-22 19:38:29

+0

@Martin - 謝謝。這有幫助。 – Art 2013-02-22 20:09:48

回答

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僞列。我也希望有層次結構方法的例子。 – Art 2013-02-22 20:10:47

+0

@Art - 沒有對等級列暴露給我們的等價物(儘管SQL Server在內部跟蹤它以查看是否達到了最大遞歸限制),但是您自己添加一個級別列是微不足道的[在此示例中](http://msdn.microsoft.com/en-us/library/ms186243(v = sql.105).aspx) – 2013-02-23 11:25:51

+0

@Martin - 非常好的例子,非常感謝。 – Art 2013-02-25 14:25:55