2017-08-18 42 views
0

我一直試圖在SQL(Oracle 11g)中實現這一點,但找不到合適的方法來做到這一點。在SQL中重複每個值n次作爲行

我的表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; 

回答

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 
0

您可以使用包含數字的列表中的某些臨時表1到N,其中N是表中names的最高數字。讓我們把它叫做num(o int)那麼查詢將

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

如果我們假設您ALL_OBJECTS系統對象具有比最大重複多個對象......

SELECT n.name 
FROM names n 
LEFT JOIN (Select rownum from all_objects) z 
on z.rowNum < n.repeat 
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;