楼主: luckysea

一个SQL问题(寻求解答中)

[复制链接]
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
21#
发表于 2011-11-4 13:51 | 只看该作者
newkid 发表于 2011-3-3 23:07
你这个语句根本没有前后级的连接条件,只有中止循环的条件LEVEL

这个确实很奇怪, 在没看你写的内容前我是完全糊涂的,看完之后似乎明白了些.但是还是很难理解这其中的道理.
同时,我还看到另一个版本的写法, 就是 连接条件改为 cnt = connect_by_root cnt, 这样即使不加dbms_random.value is not null也不报错, 可惜这个写法在11g上是非法的,同时在10g上使用时,如果还有start with语句时也报错.

使用道具 举报

回复
论坛徽章:
3
茶鸡蛋
日期:2012-04-17 16:52:07奥运会纪念徽章:跆拳道
日期:2012-08-06 14:40:25奥运会纪念徽章:蹦床
日期:2012-09-10 10:35:46
22#
发表于 2011-11-4 15:53 | 只看该作者
学习~

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
23#
发表于 2011-11-4 22:44 | 只看该作者
czwlucky 发表于 2011-11-4 13:51
这个确实很奇怪, 在没看你写的内容前我是完全糊涂的,看完之后似乎明白了些.但是还是很难理解这其中的道理 ...

哪里不理解?每次CONNECT BY就相当于把最近的一层数据和当前表作一次连接再叠加到结果集上。没有前后条件就相当于笛卡尔积。至于为什么会在前后相关时检查重复数据,笛卡尔积时又不检查了,这个不得而知。
CONNECT_BY_ROOT的用法有限制,在文档中写得很清楚,不知道为什么要如此限制,如果允许用在CONNECT BY中,可以解决一些问题。

使用道具 举报

回复
论坛徽章:
512
2012新春纪念徽章
日期:2012-01-04 11:53:54ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26股神
日期:2012-01-05 10:29:02天枰座
日期:2015-09-16 09:05:30指数菠菜纪念章
日期:2015-07-01 16:40:43喜羊羊
日期:2015-06-30 09:06:18指数菠菜纪念章
日期:2015-04-02 09:22:462015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11指数菠菜纪念章
日期:2015-01-04 11:09:18
24#
发表于 2011-11-13 22:01 | 只看该作者
终于学会CONNECT BY了,谢谢!

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
25#
发表于 2011-12-6 11:07 | 只看该作者
newkid 发表于 2011-11-4 22:44
哪里不理解?每次CONNECT BY就相当于把最近的一层数据和当前表作一次连接再叠加到结果集上。没有前后条件 ...

多谢回复. 主要是我对connect by的工作原理不了解,所以才会有迷惑. 尤其是connect by level/rownum < N与connect by col = prior col 比较起来,好像工作方式不大一样. 我是业余的,没有深入研究过oracle原理.

使用道具 举报

回复
论坛徽章:
44
2010广州亚运会纪念徽章:壁球
日期:2010-12-31 18:05:432012新春纪念徽章
日期:2012-01-04 11:54:26红宝石
日期:2012-03-27 18:07:39ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥运会纪念徽章:跆拳道
日期:2012-10-17 15:30:08灰彻蛋
日期:2012-11-07 09:39:58茶鸡蛋
日期:2012-11-19 10:06:022013年新春福章
日期:2013-02-25 14:51:24劳斯莱斯
日期:2013-09-17 14:59:36问答徽章
日期:2013-11-13 14:54:11
26#
发表于 2012-3-23 16:31 | 只看该作者
newkid 发表于 2011-2-24 23:49
比较有意思的另类写法:

create table test (id number, cnt number,c1 varchar2(10),c2 varchar2(10)); ...

SELECT *
  FROM test
CONNECT BY id = PRIOR id
       AND LEVEL <= cnt
       AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL


这个有版本限制?
ORA-01436: CONNECT BY loop in user data

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
27#
发表于 2012-3-23 22:00 | 只看该作者
fumuju 发表于 2012-3-23 16:31
SELECT *
  FROM test
CONNECT BY id = PRIOR id

什么版本?改用prior sys_guid() is not null怎么样?

使用道具 举报

回复
论坛徽章:
44
2010广州亚运会纪念徽章:壁球
日期:2010-12-31 18:05:432012新春纪念徽章
日期:2012-01-04 11:54:26红宝石
日期:2012-03-27 18:07:39ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥运会纪念徽章:跆拳道
日期:2012-10-17 15:30:08灰彻蛋
日期:2012-11-07 09:39:58茶鸡蛋
日期:2012-11-19 10:06:022013年新春福章
日期:2013-02-25 14:51:24劳斯莱斯
日期:2013-09-17 14:59:36问答徽章
日期:2013-11-13 14:54:11
28#
发表于 2012-3-26 15:53 | 只看该作者
newkid 发表于 2012-3-23 22:00
什么版本?改用prior sys_guid() is not null怎么样?

都一样,版本是:10.2.0.4.0

使用道具 举报

回复
论坛徽章:
6
咸鸭蛋
日期:2013-01-11 10:30:55优秀写手
日期:2013-12-19 06:00:122014年新春福章
日期:2014-02-18 16:47:53马上加薪
日期:2014-02-18 16:47:53慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
29#
发表于 2012-3-27 11:58 | 只看该作者
newkid 发表于 2011-2-24 23:49
比较有意思的另类写法:

create table test (id number, cnt number,c1 varchar2(10),c2 varchar2(10)); ...

稍加改进:

SELECT row_number() OVER(PARTITION BY x.c1 ORDER BY x.cnt) ID,x.c1,c2
FROM   TEST x
CONNECT BY id = PRIOR id
    AND    LEVEL <= cnt
    AND    PRIOR DBMS_RANDOM.VALUE IS NOT NULL;

使用道具 举报

回复
论坛徽章:
8
CTO参与奖
日期:2009-01-15 11:42:46SQL大赛参与纪念
日期:2011-04-13 12:08:17蛋疼蛋
日期:2012-05-31 13:19:132013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-03-13 06:00:16目光如炬
日期:2016-07-31 22:30:25火眼金睛
日期:2016-08-31 22:00:00授权会员
日期:2017-09-30 15:12:14
30#
发表于 2013-1-31 15:31 | 只看该作者
newkid 发表于 2011-2-24 23:49
比较有意思的另类写法:

create table test (id number, cnt number,c1 varchar2(10),c2 varchar2(10)); ...

SELECT *
  FROM TEST
CONNECT BY ID = PRIOR ID
       AND LEVEL <= cnt
       AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;
我这样写了,可还是报ora-01436,没招了

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表