2011-10-27 47 views
1

比方说,我有这个表:从单个查询返回多行,基于列的值

|Fld | Number| 
1  5 
2  2 

我希望做一个选择,检索多达FldNumber领域有:

|Fld | 
1 
1 
1 
1 
1 
2 
2 

我该如何做到这一点?我正在考虑制作一张临时表格,并根据Number提供数据,但我想知道是否可以使用单个Select语句完成此操作。

PS:我是新来的SQL

+0

这是什么味道的SQL? – Stu

+0

什么数据库和版本? –

+0

我不认为你可以用一个任意数字的Select语句来完成它,但你可以使用有限范围的数字或存储过程来完成。 – Neil

回答

2

不是一个很好的解决方案(因为你还是查询您的表的两倍,但也许你可以从它的工作)

SELECT t1.fld, t1.number 
    FROM table t1, (
     SELECT ROWNUM number FROM dual 
     CONNECT BY LEVEL <= (SELECT MAX(number) FROM t1)) t2 
    WHERE t2.number<=t1.number 

它生成所需的最大数量的行,然后按每行进行过滤。

+0

完美!非常感谢你。 – Roger

3

您可以用数字表连接:

SELECT Fld 
FROM yourtable 
JOIN Numbers 
ON yourtable.Number <= Numbers.Number 

Numbers表格仅仅是一个号码清单表:

Number 
1 
2 
3 
etc... 
+0

+1,可能是CTE的好时机,而不是为它创建表格。 –

2

我不知道你的RDBMS版本是否支持它(尽管我相当怀疑它的确如此),但这里是一个递归版本:

WITH remaining (fld, times) as (SELECT fld, 1 
           FROM <table> 
           UNION ALL 
           SELECT a.fld, a.times + 1 
           FROM remaining as a 
           JOIN <table> as b 
           ON b.fld = a.fld 
           AND b.number > a.times) 

SELECT fld 
FROM remaining 
ORDER BY fld 

鉴于你的源数据表,它输出这个(计数包括验证):

fld times 
============= 
1  1 
1  2 
1  3 
1  4 
1  5 
2  1 
2  2      
+0

@Roger - 对于SQL中的某些类型的分析,递归查询是重要的。学习它们。他们可以用来做各种有趣的事情。 –