Oracle中反GROUP BY的写法

问题:
比如有一张表TEST,GROUP BY后的数据如下:
NAME   CNT
A         2
B         4
C         1
..        ..
CNT为出现的次数,现在要反过来写,需要得出数据
A
A
B
B
B
B
C
请问一条SQL怎么写,而且需要考虑效率问题,不要去笛卡儿积


解决方案:
1.newKid提供的解决方案:
WITH data AS (
SELECT  'A' name, 2 cnt FROM DUAL
UNION ALL SELECT 'B', 4 FROM DUAL
UNION ALL SELECT 'C', 1 FROM DUAL
)
SELECT name
  FROM data 
CONNECT BY name=PRIOR name AND LEVEL<=cnt AND PRIOR SYS_GUID() IS NOT NULL;
2.lastwinner提供解决方案
SQL> select * from x;


C1 C2
---------- ----------
11111 1
22222 2
33333 3
44444 4[@more@]SQL> create table y (c1 number);


Table created.


SQL> insert into y
2 select a.c1 from x a,
3 (
4 select rownum rn from (select max(c2) maxlevel from x) a connect by 1=1 and level <=
5 maxlevel) b
6 where a.c2 >= rn
7 order by c1
8 /


10 rows created.


SQL> select * from y;


C1
----------
11111
22222
22222
33333
33333
33333
44444
44444
44444
44444
http://blog.itpub.net/post/4791/27191


偶的方法:
SQL> create table loopx(c1 varchar2(20),c2 number(3));
表已创建。
SQL> insert into loopx select lpad(rownum,5,rownum),rownum from dual connect by
rownum<5;
已创建4行。
SQL> select * from loopx;
C1 C2
-------------------- ----------
11111 1
22222 2
33333 3
44444 4
SQL> select distinct a.c1,level from loopx a connect by level<=c2;
C1 LEVEL
-------------------- ----------
11111 1
22222 1
22222 2
33333 1
33333 2
33333 3
44444 1
44444 2
44444 3
44444 4
已选择10行。
不明白他为什么要写那么复杂,不过我用了distinct,过滤了大量的记录,也许这种方法效率低吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值