- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Oracle SQL开发基础 ——分级取回数据(层次查询) 东软人才实训中心 目标 完成本课后, 您应当能够执行下列操作: 解释分级查询的概念 创建一个树型结构的报告 格式化分级数据 从树型结构中去除分支 EMP 表中的例子数据 自然树结构 分级查询(层次查询) 分级查询 LEVEL:节点的层次,伪列,由查询的起点开始算起为1,依次类推。 FROM table:指定表、视图或包含列的快照,你只能从单独的一个表中选择。 WHERE: 限制返回的行。 Condition:是一个比较式。 START WITH:指定层次的根行 (起点)。这个子句对于一个正确的分级查询是必须的。 CONNECT BY PRIOR:指定存在父与子行的关系列。对于分级查询该子句是必须的。 遍历树 指定必须满足的条件 接受有效的条件 使用 EMP 表,从名字是KING 的雇员开始 遍历树 遍历树:从底向上 遍历树:从顶向下 用 LEVEL 伪列将行分等级 用 LEVEL 伪列将行分等级 SELECT LEVEL,EMPNO,ENAME,JOB,MGRFROM EMPSTART WITH ENAME = ‘KING’CONNECT BY PRIOR EMPNO = MGR; 用 LEVEL 和 LPAD 格式化分级报告 创建一个报告显示公司的管理层,从最高级别开始,缩进下面跟随的级别 修剪分支 小结 在本课中, 您应该已经学会下面的内容: 能够用分级查询查看一个表中各行之间的分级关系 指定查询的起点 通过修剪除去结点或分支 练习 19 概览 本章练习包括下面的主题: 区别分级查询和非分级查询 遍历树 用 LEVEL 伪列生成一个缩进的报表 修剪树结构 输出排序 用 LEVEL 和 LPAD 格式化分级报告 在一个树中的节点从根开始被指定级别数。用 LPAD 函数与伪列 LEVEL 协同以显示一个缩进树的分等级报告。 在幻灯片的例子中: LPAD(char1,n [,char2]) 返回 char1,用在 char2 中的字符序列左填充到长度 n。参数 n 是返回值的总长度。 LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,‘_’) 定义显示格式。 char1 是 LAST_NAME,n 是返回值得总长度,是 LAST_NAME +(LEVEL*2)-2 的长度,char2 是 _‘。 换句话说,该函数告诉 SQL 获取 LAST_NAME 并且用 ‘_’ 字符左填充它到结果串的长度等于由 LENGTH(last_name)+(LEVEL*2)-2 定义的值。 对于 King,LEVEL = 1,因此,(2 * 1) - 2 = 2 - 2 = 0,所以对 King 不填充 ‘_’ 字符并且显示在第一列。 对于 Kochhar,LEVEL = 2. Hence, (2 * 2) - 2 = 4 - 2 = 2,所以用2个 ‘_’ 字符填充在 Kochhar 的左边,并且缩进显示。 在 EMPLOYEES 表中其它的记录都类似地显示。 修剪分支 你可以用 WHERE 和 CONNECT BY 字句修剪树;更确切地说,就是控制哪个节点或行被显示。你使用的谓词作用如同布尔条件。 例子 从根开始,自顶向下遍历,在结果中除去雇员 Higgins,但它的子行。 SELECT department_id, employee_id,last_name, job_id, salary FROM employees WHERE last_name != Higgins START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id; 从根开始,自顶向下遍历,除去雇员 Higgins 及其所有的子行。 SELECT department_id, employee_id,last_name, job_id, salary FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id AND last_name != Higgins; 教师注释 你可能希望再这儿添加 WHERE 字句来限制一个节点,这可能导致层次不能被真实地反映在输出中。 * 3 Sept. 2008 Confidential * 3 Sept. 2008 ? Neusoft Confidential * Copyright
文档评论(0)