楼主: luckysea

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

[复制链接]
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
11#
发表于 2011-2-24 12:10 | 只看该作者
原帖由 luckysea 于 2011-2-24 11:44 发表
总感觉开发比较简单,其实不然。看来需要重视了,呵呵

开发要简单的话,那DBA会减少一大批,我认为没有啥东西是简单的,立场和角度不同,比如有的DBA就专门干备份恢复,脚本现成的,什么都有脚本和规则,他认为DBA简单,但是很多人认为DBA不简单

使用道具 举报

回复
论坛徽章:
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
12#
发表于 2011-2-24 23:49 | 只看该作者
比较有意思的另类写法:

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

insert into test values (1,3,'aa', 'aaa');
insert into test values (2,4,'bb', 'bbb');   

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


SELECT test.*
  FROM test
      ,TABLE( CAST( MULTISET( SELECT LEVEL
                                FROM DUAL
                              CONNECT BY LEVEL <= cnt
                            )
              AS SYS.ODCINUMBERLIST )  
            ) t2
;

使用道具 举报

回复
论坛徽章:
32
祖国60周年纪念徽章
日期:2009-10-09 08:28:002013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-06-28 11:09:23ITPUB季度 技术新星
日期:2013-07-30 16:04:58优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09红孩儿
日期:2014-03-04 16:40:38美羊羊
日期:2015-02-16 16:36:28懒羊羊
日期:2015-03-04 14:52:11
13#
发表于 2011-2-25 08:50 | 只看该作者
动态构建每个组的虚拟行数,呵呵,学习了

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-17 18:02:022011新春纪念徽章
日期:2011-02-18 11:43:36
14#
发表于 2011-3-2 17:28 | 只看该作者

回复 #12 newkid 的帖子

你好,

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

对于这个写法不是很理解,可以剖析,或者分解下么?嘻嘻

使用道具 举报

回复
论坛徽章:
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
15#
发表于 2011-3-2 23:29 | 只看该作者
你能理解CONNECT BY吧?它相当于是一个递归的自连接,不断地把每层的连接结果叠加到结果集中。两层之间的连接条件和递归出口写在CONNECT BY中。在这里我们的数据并无父子关系,只是要让同一行数据重复出现,因此我们的连接的条件只用到了表的主键id=PRIOR id, 此外再用LEVEL控制层数作为递归出口。但ORACLE有个检查,如果你有前后连接条件(id=PRIOR id),但是同一行数据再次出现,它就会报一个错:
ERROR:
ORA-01436: CONNECT BY loop in user data
为了欺骗它,这里用了一个PRIOR DBMS_RANDOM.VALUE, 因为DBMS_RANDOM.VALUE每次调用都返回不同结果,所以它认为两行数据不一样,所以不报错了。

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-17 18:02:022011新春纪念徽章
日期:2011-02-18 11:43:36
16#
发表于 2011-3-3 14:36 | 只看该作者

回复 #15 newkid 的帖子

说实话,connect by 还真不知怎么理解。 connect by [ prior ] [start with] 我知道是在一起。
单只有connect by ,如下句
select t.*,level from dual t connect by level<10
怎么理解呢?递归的自连接,那么,这里的连接 只的是 * 连上 *
假设我有个One表, 他有 id,name 2列。
create table ONE
(
  ID   VARCHAR2(20),
  NAME VARCHAR2(20)
);

insert into one(id,name) values (9,96);
insert into one(id,name) values (123,22);

select id,name,level from one connect by level<3
那么在上面这句话中,这里的连接,是指什么连接呢?id单独连id?name单独连name?抑或是2者都关联?

使用道具 举报

回复
论坛徽章:
3
奥运会纪念徽章:铁人三项
日期:2008-08-14 11:45:20生肖徽章2007版:马
日期:2009-03-20 11:26:202010新春纪念徽章
日期:2010-03-01 11:19:07
17#
发表于 2011-3-3 15:31 | 只看该作者
这个也可以从父子的角度去看
对于ORA-01436,也是指同一行记录即是父又是子,这是不允许的

使用道具 举报

回复
论坛徽章:
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
18#
发表于 2011-3-3 23:07 | 只看该作者
原帖由 alafqq 于 2011-3-3 14:36 发表
说实话,connect by 还真不知怎么理解。 connect by [ prior ] [start with] 我知道是在一起。
单只有connect by ,如下句
select t.*,level from dual t connect by level<10
怎么理解呢?递归的自连接,那么,这里的连接 只的是 * 连上 *
假设我有个One表, 他有 id,name 2列。
create table ONE
(
  ID   VARCHAR2(20),
  NAME VARCHAR2(20)
);

insert into one(id,name) values (9,96);
insert into one(id,name) values (123,22);

select id,name,level from one connect by level<3
那么在上面这句话中,这里的连接,是指什么连接呢?id单独连id?name单独连name?抑或是2者都关联?

你这个语句根本没有前后级的连接条件,只有中止循环的条件LEVEL<3, 所以它相当于每次都把当前层的数据和ONE表作一个笛卡尔连接。
奇怪的是ORACLE在这种情况下不报错,即使同一行数据不断出现。但如果有连接条件,一行数据重复出现它就报错。

使用道具 举报

回复
论坛徽章:
10000
绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2015-12-16 18:42:35绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-09-10 13:05:08
19#
发表于 2011-3-7 11:00 | 只看该作者
原帖由 newkid 于 2011-3-2 23:29 发表
你能理解CONNECT BY吧?它相当于是一个递归的自连接,不断地把每层的连接结果叠加到结果集中。两层之间的连接条件和递归出口写在CONNECT BY中。在这里我们的数据并无父子关系,只是要让同一行数据重复出现,因此我们的连接的条件只用到了表的主键id=PRIOR id, 此外再用LEVEL控制层数作为递归出口。但ORACLE有个检查,如果你有前后连接条件(id=PRIOR id),但是同一行数据再次出现,它就会报一个错:
ERROR:
ORA-01436: CONNECT BY loop in user data
为了欺骗它,这里用了一个PRIOR DBMS_RANDOM.VALUE, 因为DBMS_RANDOM.VALUE每次调用都返回不同结果,所以它认为两行数据不一样,所以不报错了。


学习了

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:08:27SQL大赛参与纪念
日期:2011-04-13 12:08:172010广州亚运会纪念徽章:空手道
日期:2011-03-08 15:29:592011新春纪念徽章
日期:2011-02-18 11:43:362010广州亚运会纪念徽章:台球
日期:2011-01-26 10:41:28数据库板块每日发贴之星
日期:2010-12-10 01:01:022010广州亚运会纪念徽章:网球
日期:2010-12-09 13:11:342010广州亚运会纪念徽章:篮球
日期:2010-12-06 14:28:04辩论纪念章
日期:2010-11-15 10:46:13ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52
20#
发表于 2011-3-7 11:05 | 只看该作者
原帖由 newkid 于 2011-3-2 23:29 发表
你能理解CONNECT BY吧?它相当于是一个递归的自连接,不断地把每层的连接结果叠加到结果集中。两层之间的连接条件和递归出口写在CONNECT BY中。在这里我们的数据并无父子关系,只是要让同一行数据重复出现,因此我们的连接的条件只用到了表的主键id=PRIOR id, 此外再用LEVEL控制层数作为递归出口。但ORACLE有个检查,如果你有前后连接条件(id=PRIOR id),但是同一行数据再次出现,它就会报一个错:
ERROR:
ORA-01436: CONNECT BY loop in user data
为了欺骗它,这里用了一个PRIOR DBMS_RANDOM.VALUE, 因为DBMS_RANDOM.VALUE每次调用都返回不同结果,所以它认为两行数据不一样,所以不报错了。


PRIOR DBMS_RANDOM.VALUE学习...今天在另外一帖看到了这个,特来学习

使用道具 举报

回复

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

本版积分规则 发表回复

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