2011-02-15 41 views
3

我需要編寫一個SQL查詢,該查詢將生成一個給定開始和結束範圍的有效整數列表。SQL生成2個已知整數之間的有效值範圍

即給出如下表: -

CMPY------MIN_YEAR------MAX_YEAR 
PS--------2007----------2014 

我想編寫一個查詢這將返回所有有效值(對CMPY),即: -

CMPY YEAR 
PS 2007 
PS 2008 
PS 2009 
PS 2010 
PS 2011 
PS 2012 
PS 2013 
PS 2014 

這需要工作在Oracle和SQL Server上。

+0

我有點困惑,你想這爲sql服務器或oracle? – jachguate 2011-02-15 16:38:16

回答

3

對於您可能希望創建數字的簡單的表像這樣的便攜式解決方案:

create table integers (val integer); 

然後用盡可能多的行填充它,你可能永遠都需要。那麼你的查詢是:

select t.cmpy, i.val 
from mytable t 
join integers i on i.val between t.min_year and t.max_year; 
+0

由於可移植性使用此方法 – Neil 2011-02-16 09:10:41

2

看着你的數據,數字是幾年。你可以在包含所有年份的兩個服務器創建一個表,然後在其上加入:

select year.YearNr 
from YourTable yt 
join YearTable year 
on  year.YearNr between yt.StartDate and yt.EndDate 

這有效地每年用於之間創建一個列,Oracle和SQL Server中。

2

最有效的方式做到這一點是有一個號碼(INT NUM)表中可以查詢得到一個範圍內的數字,如:

SELECT C.CMPY, N.num 
FROM CMPY AS C 
JOIN Numbers AS N 
    ON N.num BETWEEN C.MIN_YEAR AND C.MAX_YEAR 
+0

由於可移植性而採用類似的解決方案 – Neil 2011-02-16 09:13:16

3

解決方案甲骨文沒有任何表(可使用SQL Server的表方式):

SELECT a.cmpy, (a.min_year - 1) + LEVEL MIN_YEAR 
    FROM YOUR_TABLE a 
    CONNECT BY (LEVEL-1) <= (MAX_YEAR - MIN_YEAR)     

如:

SELECT a.cmpy, (a.min_year - 1) + LEVEL MIN_YEAR 
    FROM (
        SELECT 'PS' CMPY, 2007 MIN_YEAR, 2014 MAX_YEAR 
        FROM DUAL 
       ) a 
    CONNECT BY (LEVEL-1) <= (MAX_YEAR - MIN_YEAR)