我需要编写一个SQL查询,它将生成一个有效整数列表,给出范围的开始和结束。
即给出下表: -
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 :(得分: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;
答案 1 :(得分:3)
没有任何表的Oracle解决方案(您可以使用SQL Server的表方式):
SELECT a.cmpy, (a.min_year - 1) + LEVEL MIN_YEAR
FROM YOUR_TABLE a
CONNECT BY (LEVEL-1) <= (MAX_YEAR - MIN_YEAR)
e.g:
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)
答案 2 :(得分:2)
查看您的数据,数字是多年。您可以在包含所有年份的两个服务器中创建一个表,然后加入它:
select year.YearNr
from YourTable yt
join YearTable year
on year.YearNr between yt.StartDate and yt.EndDate
这有效地为Oracle和SQL Server之间的每年创建一行。
答案 3 :(得分:2)
最有效的方法是使用Numbers(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