oracle子查询与节点查询.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最近项目中用到了很多ORACLE的查询语句,尤其是各种连接查询和子查询,现在就总结下这些语句的用法和部分效率相关内容. 首先是连接查询.当我们所需要的数据存在于两张不同的表中时,这个时候就需要用到表连接查询. ? 1. select d.deptno,d.dname,e.empno,e.ename,e.sal from dept d join emp e on d.deptno=e.deptno; --这是在做一个连接查询,连接的条件就是以表emp别名e和表dept别名d的deptno字段相等为条件做的一个表连接查询 当emp表中的deptno字段与dept 中的deptno字段能一一对应的时候,就现在在结果集中 ? 2. select d.deptno,d.dname,e.empno,e.ename,e.sal from dept d , emp e where d.deptno=e.deptno; --这个其实做得是和上面一样的一个连接查询,功能完全一样,如果前一个写法是现代写法,那么这个写法就算是古典写法吧 ? 3.?? select d.deptno,d.dname,e.empno,e.ename,e.sal from dept d left join emp e on d.deptno=e.deptno; --这是左连接查询,就是第一种查询里加了一个关键字left, 这种查询的结果于第一种不同,左边的表 dept 中所有的记录都会显示在结果集中,无论emp表中是否有与之对应的 对应left还有right,那么就是连接时,右边表的结果集全都显示在表中,叫做右连接 ? 4. ORACLE针对左右连接查询,还有特别的符号(+),并且ORALCE针对使用这个符号的连接查询做了特别的优化, select d.deptno,d.dname,e.empno,e.ename,e.sal from dept d,emp e where d.deptno=e.deptno(+); --这个加号写在左边,其查询的结果和使用left的左连接查询效果相同 select d.deptno,d.dname,e.empno,e.ename,e.sal from dept d,emp e where d.deptno(+)=e.deptno; --这个加号写在左边,其查询的结果和使用right的右连接查询效果相同 ? 5. 最后还有一种全连接,使用full join 关键字 select d.deptno,d.dname,e.empno,e.ename,e.sal from dept d full join emp e on d.deptno=e.deptno; --这种查询效率不高,很少用到,左右表的数据全显示 ? 6.自连接,这个就是数据都在一张表中,但是需要根据条件筛选 select yg.ename,sj.ename 上级 from emp yg,emp sj where yg.mgr=sj.empno ? 下面介绍下oracle特有的树形查询语句 一般来说,如果数据库本身没有封装树形查询,那么就需要使用JAVA或者其他语言写相应的递归查询,写起来是比较复杂的,用起来效率肯定也没oracle封装后的效率高. 先建立一张表,用于保存一个树形结构. create table type_tree( ? type_id number(5) primary key, ? type_name varchar2(10), ? parent_type number(5) ); 也有很多项目使用的两张表或者多张表保存属性结构,这样也是可以保存的,但是这样的设计对于很复杂的树形结构是很不方便的,因为每一个节点都必须要有一张对应的表,当查询涉及多个节点的时候,就需要连接多个表,连接的表越多,效率越低. 而且在以后扩展业务需求的时候,节点增加,表也增加. 如果项目中不会涉及到很多的树形查询,那么我个人认为这种设计也是可以的接受的. 7.使用自链接查询子节点,父节点 select s.type_name as 节点,p.type_name as 父节点 from type_tree s,type_tree p where s.parent_type=p.type_id order by 2 --这种查询也可以查处某种成都的树形结构,只不过其缺点是只能知道父节点和子节点两层,更多的需求还是需要使用递归查询. ? 8.使用Oracle提供了递归查询(又叫树型查询) select? t.*,level as 层次 --level,oracle数据库中的关键字,表示层次 from 表 t where 普通条件 --也可以用于限制level start with 子ID=? -

文档评论(0)

ea238982 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档