LZ你好
这个rpad是右边填充的意思,但是填充的是
但这个RPAD( ' ', 2*(LEVEL-1), '-' )意思是在空格右侧填充2*(LEVEL-1)个长度的横杠,这个你理解的好像没问题
level开始是从start with开始算起的,你这里就是START WITH UPPERDEPID IS NULL,因为根据父ID,你这个为空的就是最顶层,这个你也可以改成
START WITH UPPERDEPID =0 看下效果
树形结构的意思,我简单给你说一下
那么画图出来就是这样
CONNECT_BY_ROOT 从你start with的开始算起,最顶端结点就是总经办,这个你看下查询结果就能看出来
CONNECT_BY_ISLEAF 如果下边还有子节点,就为0,无子节点了就是1,按照我给你发的图,也就是四个孙子下边都没节点了,他们最后都显示1,上边爷爷和儿子都显示0
level,就是爷爷是最顶端,为1,依次类推
给你举例子的图画的难看了点哈,见笑了
晕,你补充了好多啊,你先看吧,哪不懂你再问,我再给你解释
可以的,用connected by level结构实现。
比如:
表结构数据现在是这样:
code stime etime
0001 08:00 12:00
0002 14:30 17:30
使用connect by level来得到每30分钟一条记录的结果,如下:
WITHt
AS
(
SELECT '0001' AS code, '08:00' AS stime, '12:00' AS etime
FROM dual
UNION
SELECT '0002' AS code, '14:30' AS stime, '17:30' AS etime
FROM dual
)
SELECT code, decode(level, 1, stime, to_char(to_date(stime, 'hh24:mi') + 30.0 / 60 / 24 * (level - 1), 'hh24:mi')), decode(level, (to_date(etime, 'hh24:mi') - to_date(stime, 'hh24:mi')) * 24 * 60 / 30, etime, to_char(to_date(stime, 'hh24:mi') + 30.0 / 60 / 24 * level, 'hh24:mi')), level
FROM t
CONNECT BY code = PRIOR(code
AND PRIOR(dbms_random.value IS NOT NULL
AND level <= (to_date(etime, 'hh24:mi') - to_date(stime, 'hh24:mi')) * 24 * 60 / 30))
运行结果
code stime etime
0001 08:00 08:30
0001 08:30 09:00
0001 09:00 09:30
0001 09:30 10:00
0001 10:00 10:30
0001 10:30 11:00
0001 11:00 11:30
0001 11:30 12:00
0002 14:30 15:00
0002 15:00 15:30
0002 15:30 16:00
0002 16:00 16:30
0002 16:30 17:00
0002 17:00 17:30
这是oracle的一个特殊用法,就是生成一个从2010-1-1开始的日期序列:1/1/2010
1/2/2010
1/3/2010
1/4/2010
1/5/2010
1/6/2010
1/7/2010
1/8/2010
1/9/2010
1/10/2010
1/11/2010
1/12/2010
1/13/2010
1/14/2010
1/15/2010
1/16/2010
1/17/2010
1/18/2010
1/19/2010
1/20/2010
1/21/2010
1/22/2010
1/23/2010
1/24/2010
1/25/2010
1/26/2010
1/27/2010
1/28/2010
1/29/2010
1/30/2010
1/31/2010
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)