楼主: luckysea

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

[复制链接]
论坛徽章:
22
奥运会纪念徽章:马术
日期:2013-02-17 16:10:59奥运会纪念徽章:射击
日期:2013-03-11 14:17:07奥运会纪念徽章:羽毛球
日期:2013-03-18 14:45:35奥运会纪念徽章:举重
日期:2013-03-18 14:45:35奥运会纪念徽章:击剑
日期:2013-03-18 14:45:35奥运会纪念徽章:垒球
日期:2013-03-18 14:45:35奥运会纪念徽章:体操
日期:2013-03-27 16:57:50奥运会纪念徽章:垒球
日期:2013-04-27 15:03:482014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
31#
发表于 2013-3-9 11:45 | 只看该作者
newkid 发表于 2012-3-23 22:00
什么版本?改用prior sys_guid() is not null怎么样?

验证了一下,应该是在11.1版本下会报 -01436错误
例如
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE        11.1.0.6.0        Production

TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

但是在11.2版本下不会.

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
16
2013年新春福章
日期:2013-02-25 14:51:24美羊羊
日期:2015-03-04 14:54:27凯迪拉克
日期:2014-11-20 09:13:05马上有钱
日期:2014-02-18 16:49:312014年新春福章
日期:2014-02-18 16:49:31优秀写手
日期:2013-12-18 09:29:13法拉利
日期:2013-10-18 16:22:26ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34ITPUB社区12周年站庆徽章
日期:2013-10-08 14:54:39
32#
发表于 2013-3-9 22:03 | 只看该作者
newkid 发表于 2011-3-2 23:29
你能理解CONNECT BY吧?它相当于是一个递归的自连接,不断地把每层的连接结果叠加到结果集中。两层之间的连 ...

使用道具 举报

回复
论坛徽章:
2
暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
33#
发表于 2015-3-2 11:35 | 只看该作者
newkid 发表于 2011-3-2 23:29
你能理解CONNECT BY吧?它相当于是一个递归的自连接,不断地把每层的连接结果叠加到结果集中。两层之间的连 ...

终于明白了

使用道具 举报

回复
论坛徽章:
0
34#
发表于 2015-3-11 10:20 | 只看该作者
学习了!赞!

使用道具 举报

回复
论坛徽章:
2
优秀写手
日期:2014-08-22 06:00:03慢羊羊
日期:2015-03-11 16:58:50
35#
发表于 2015-3-11 12:43 | 只看该作者
本帖最后由 fuzhangpeng 于 2015-3-11 12:44 编辑

来迟了。。。。
SQL> select * from t1;

        ID NAME
---------- ------------------------------------------------------------
         1 123
         2 bb
         3 dd

SQL> SELECT * FROM t1     
  connect by  level <=id        
  and    Prior id = id
  And Prior dbms_random.value() Is Not Null;

        ID NAME
---------- ------------------------------------------------------------
         1 123
         2 bb
         2 bb
         3 dd
         3 dd
         3 dd

6 rows selected.

使用道具 举报

回复
招聘 : 数据库开发
论坛徽章:
0
36#
发表于 2015-3-11 14:51 | 只看该作者
本帖最后由 yaoweber 于 2015-3-11 14:55 编辑

我比较笨,只懂的用笨方法。希望可以帮到你。
这里是构造表
  1. CREATE TABLE test_weber2(ID NUMBER,NAME VARCHAR2(12),sex VARCHAR2(2));

  2. INSERT INTO test_weber2 VALUES(3,'aaa','F');
  3. INSERT INTO test_weber2 VALUES(4,'aaa','M');
  4. SELECT * FROM TEST_WEBER2
复制代码
这里是代码


  1. DECLARE
  2.   CURSOR CUR1 IS
  3.     SELECT ID FROM TEST_WEBER2;
  4.   V_CNT NUMBER;
  5.   V_NUM NUMBER := 1;

  6. BEGIN
  7.   FOR C IN CUR1 LOOP
  8.     V_CNT := C.ID;
  9.     WHILE V_NUM <= V_CNT LOOP
  10.       INSERT INTO TEST_WEBER2
  11.       VALUES
  12.         (V_NUM,
  13.          (SELECT NAME FROM TEST_WEBER2 WHERE ID = V_CNT),
  14.          (SELECT SEX FROM TEST_WEBER2 WHERE ID = V_CNT));
  15.       V_NUM := V_NUM + 1;
  16.     END LOOP;
  17.     V_NUM :=1;
  18.   END LOOP;
  19.   COMMIT;
  20. END;
复制代码









使用道具 举报

回复
论坛徽章:
22
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00马上加薪
日期:2014-10-21 18:48:25马上加薪
日期:2014-10-21 18:48:312015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39沸羊羊
日期:2015-06-11 17:08:14巨蟹座
日期:2015-07-10 09:11:44天枰座
日期:2016-01-18 10:58:39秀才
日期:2016-02-18 10:08:14秀才
日期:2016-06-23 14:15:06
37#
发表于 2015-3-19 19:56 | 只看该作者
SQL> with t as (
  2  select 3 id, 'a' val from dual union all
  3  select 4 id, 'b' val from dual )
  4  select distinct level,val from t connect by level <= id
  5  order by val ;

     LEVEL VA
---------- --
         1 a
         2 a
         3 a
         1 b
         2 b
         3 b
         4 b

使用道具 举报

回复
论坛徽章:
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
38#
发表于 2015-3-19 21:18 | 只看该作者
stevendba 发表于 2015-3-19 19:56
SQL> with t as (
  2  select 3 id, 'a' val from dual union all
  3  select 4 id, 'b' val from dual ...

这种写法很低效,前后级之间是笛卡尔积,中间数据太多了。

使用道具 举报

回复
论坛徽章:
22
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00马上加薪
日期:2014-10-21 18:48:25马上加薪
日期:2014-10-21 18:48:312015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39沸羊羊
日期:2015-06-11 17:08:14巨蟹座
日期:2015-07-10 09:11:44天枰座
日期:2016-01-18 10:58:39秀才
日期:2016-02-18 10:08:14秀才
日期:2016-06-23 14:15:06
39#
发表于 2015-3-20 09:19 | 只看该作者
newkid 发表于 2015-3-19 21:18
这种写法很低效,前后级之间是笛卡尔积,中间数据太多了。

受教了!

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
40#
发表于 2017-3-20 14:21 | 只看该作者
newkid 发表于 2011-3-3 23:07
你这个语句根本没有前后级的连接条件,只有中止循环的条件LEVEL

不知道现在回复是不是有一点晚,我想现在你肯定理解这个connect by level<x的写法了
它其实是以任意一条记录为根,然后寻找原集合中任意一条记录为下一节点,周而复始,直到level<x不成立时方终止递归

加上level<x的约束后,level就不会无限制的扩大。

14:07:48 SCOTT@Z3> select id,name,level, sys_connect_by_path(name,',') sc, connect_by_root name rootname from one connect by level<4;

ID         NAME            LEVEL SC                   ROOTNAME
---------- ---------- ---------- -------------------- --------------------
9          96                  1 ,96                  96
9          96                  2 ,96,96               96
9          96                  3 ,96,96,96            96
123        22                  3 ,96,96,22            96
123        22                  2 ,96,22               96
9          96                  3 ,96,22,96            96
123        22                  3 ,96,22,22            96
123        22                  1 ,22                  22
9          96                  2 ,22,96               22
9          96                  3 ,22,96,96            22
123        22                  3 ,22,96,22            22
123        22                  2 ,22,22               22
9          96                  3 ,22,22,96            22
123        22                  3 ,22,22,22            22
14 rows selected.


如果只加上 prior name<>name的条件,无nocycle,则oracle没有办法限制下一个路径中的对象和以前的不重复,所以就会报错。
14:10:31 SCOTT@Z3> select id,name,level, sys_connect_by_path(name,',') sc, connect_by_root name rootname from one connect by level<4 and prior name<>name;
ERROR:
ORA-01436: 用户数据中的 CONNECT BY 循环



no rows selected

但如果将level<4改为level<3则可以执行成功,不指定nocycle也能成功,这是由于数据的特点导致的。
14:10:44 SCOTT@Z3> select id,name,level, sys_connect_by_path(name,',') sc, connect_by_root name rootname from one connect by level<3 and prior name<>name;

ID         NAME            LEVEL SC                   ROOTNAME
---------- ---------- ---------- -------------------- --------------------
9          96                  1 ,96                  96
123        22                  2 ,96,22               96
123        22                  1 ,22                  22
9          96                  2 ,22,96               22



select id,name,level, sys_connect_by_path(name,',') sc, connect_by_root name rootname from one connect by nocycle level<4 and prior name<>name;
这一句的结果和上面相同

使用道具 举报

回复

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

本版积分规则 发表回复

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