基于列的值从单个查询返回多个行

时间:2011-10-27 20:24:26

标签: sql oracle

假设我有这张表:

|Fld | Number|
 1     5
 2     2

我想创建一个选择,检索与Fld字段一样多的Number

|Fld |
 1
 1
 1
 1
 1
 2
 2

我怎样才能做到这一点?我正在考虑根据Number创建一个临时表和instert数据,但我想知道是否可以使用一个Select语句来完成。

PS:我是SQL的新手

3 个答案:

答案 0 :(得分:3)

您可以加入数字表:

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

数字表只是一个包含数字列表的表:

 Number
 1
 2
 3
 etc...

答案 1 :(得分: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                     

答案 2 :(得分: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

它会生成所需的最大行数,然后按行对其进行过滤。