我一直试图在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;
答案 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;