在SQL中将每个值重复n次作为行

时间:2017-08-18 12:28:18

标签: sql oracle

我一直试图在SQL(Oracle 11g)中实现这一点,但找不到合适的方法。

我的表names包含以下行:

NAME      REPEAT
----      ------
KAUSHIK   2
KARTHIK   3
NIDHI     1
ASHWINI   5
JAGADEESH 6

我需要的是这样的输出:

NAME
----
KAUSHIK    -- 2 rows
KAUSHIK
KARTHIK
KARTHIK    -- 3 rows
KARTHIK
NIDHI      -- 1 row
ASHWINI
ASHWINI    -- 5 rows
...

等等。

到目前为止,我尝试过的其中一个查询当然无效。我也尝试使用unpivot,但似乎找不到合适的方法来实现这一目标。

SELECT m.name
FROM names m
INNER JOIN
  ( SELECT name, repeat FROM names
  ) n
ON m.name = n.name
  CONNECT BY LEVEL <= n.repeat;

4 个答案:

答案 0 :(得分:3)

试试这个:

select * from names
cross join (select rownum n from dual
            connect by level <= (select max(repeat) from names))
where n <= repeat
order by name

答案 1 :(得分:1)

您可以使用包含数字1到N的列表的临时表,其中N是表names中的最高数字。我们称之为num(o int)然后查询

SELECT *
FROM names, num
WHERE num.o <= names.repeat

答案 2 :(得分:1)

如果我们假设你的all_objects系统对象拥有的对象多于max repeat ...

SELECT n.name
FROM names n
LEFT JOIN (Select rownum from all_objects) z
 on z.rowNum < n.repeat

答案 3 :(得分:0)

我刚刚找到了一个带有连接和相关子查询的替代方案。

select name
from   names o
connect by level <= ( select repeat from names 
                        i where i.name = o.name )
AND                        
prior name = name and
           prior sys_guid() is not null
           order by name;