一、start with.....connect by递归查询
建表语句:
CREATE TABLE D_ZONECODE
(
ID VARCHAR2(36) NOT NULL UNIQUE,
ZONECODE VARCHAR2(6) NOT NULL,
SUPERCODE VARCHAR2(6) NOT NULL,
ZONELLEVEL VARCHAR2(2) NOT NULL,
ZONENAME VARCHAR2(60) NOT NULL
);
插入数据语句:
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('1', '370000', '000000', '01', '山东省');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('2', '370100', '370000', '02', '济南市');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('3', '370102', '370100', '03', '历下区');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('4', '370103', '370100', '03', '市中区');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('5', '370104', '370100', '03', '槐荫区');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('6', '370105', '370100', '03', '天桥区');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('7', '370112', '370100', '03', '历城区');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('8', '370113', '370100', '03', '长清区');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('9', '370114', '370100', '03', '高新区');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('10', '370124', '370100', '03', '平阴县');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('11', '370125', '370100', '03', '济阳县');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('12', '370126', '370100', '03', '商河县');
INSERT INTO D_ZONECODE (ID, ZONECODE, SUPERCODE, ZONELLEVEL, ZONENAME) VALUES ('13', '370181', '370100', '03', '章丘市');
root向树末梢查询:
select * from d_zonecode
start with id=’370000’
connect by prior zonecode = supercode;
树末梢向ROOT查询:
select * from d_zonecode
start with zonecode = '370100'
connect by prior supercode = zonecode;
附:
start with指明从哪里开始遍历树
connect by 就是指明父子关系,注重PRIOR位置
CONNECT_BY_ROOT: 提供获取根节点记录的字段信息。
二、 今天客户突然要一个表格,这里面包括两个表的总分关系,比如我要显示部门同时和该部门下的所有人员用一条记录显示,在网上搜到一个例子,记录下方便使用。
建表语句:
/* Create Tables */
CREATE TABLE DEPT
(
ID VARCHAR2(36) NOT NULL UNIQUE,
DEPTID VARCHAR2(4) NOT NULL UNIQUE,
DEPTNAME VARCHAR2(60) NOT NULL
);
CREATE TABLE D_USER
(
ID VARCHAR2(36) NOT NULL UNIQUE,
USERID VARCHAR2(6) NOT NULL UNIQUE,
USERNAME VARCHAR2(60) NOT NULL,
DEPTID VARCHAR2(4) NOT NULL
);
插入数据语句:
-- 部门表
INSERT INTO dept (id, deptid, deptname) VALUES ('1', '0001', '市场部');
INSERT INTO dept (id, deptid, deptname) VALUES ('2', '0002', '开发部');
INSERT INTO dept (id, deptid, deptname) VALUES ('3', '0003', '项目部');
-- 用户表
INSERT INTO D_USER (id, userid, username, deptid) VALUES ('1', '100001', '张肃宁', '0001');
INSERT INTO D_USER (id, userid, username, deptid) VALUES ('2', '100002', '王济南', '0002');
INSERT INTO D_USER (id, userid, username, deptid) VALUES ('3', '100003', '赵临沂', '0001');
INSERT INTO D_USER (id, userid, username, deptid) VALUES ('4', '100004', '金淄博', '0003');
INSERT INTO D_USER (id, userid, username, deptid) VALUES ('5', '100005', '李德州', '0002');
INSERT INTO D_USER (id, userid, username, deptid) VALUES ('6', '100006', '周济宁', '0001');
INSERT INTO D_USER (id, userid, username, deptid) VALUES ('7', '100007', '姜潍坊', '0003');
INSERT INTO D_USER (id, userid, username, deptid) VALUES ('8', '100008', '万青岛', '0001');
查询:
select * from dept t;
select * from d_user t;
测试sql如下:
select username from (
select row_number() over(order by lv desc) id,username,deptid from (
select level lv, replace(sys_connect_by_path(username,','),',',',') username,deptid from(
select deptid,username,row_number() over(order by username) id from
(
select a.deptid,a.deptname,b.username
from dept a,d_user b
where a.deptid = b.deptid
)
) connect by prior id = id-1 )) where id = 1;
要是需要和部门连接查询,我采用建立一个方法,然后查询部门记录时调用该方法,传部门id这个参数进去。
--方法建立:
create or replace function getUsername(oc_deptid in varchar2
) return varchar2 is
oc_result varchar(300);
oc_username varchar2(300); -- 取值
begin
--查询用户名称
select username into oc_result from (
select row_number() over(order by lv desc) id,username,deptid from (
select level lv, replace(sys_connect_by_path(username,','),',',',') username,deptid from(
select deptid,username,row_number() over(order by username) id from
(
select a.deptid,a.deptname,b.username
from dept a,d_user b
where a.deptid = b.deptid and a.deptid = oc_deptid
)
) connect by prior id = id-1 )) where id = 1;
oc_username:=oc_result;
if oc_result is NULL then
oc_username := '';
else
oc_username := SUBSTR(oc_result,INSTR(oc_result,',')+1,LENGTH(oc_result)-1);
end if;
return oc_username;
end;
查询sql:
select t.deptid,t.deptname,getUsername(t.deptid) as username from dept t;
附(CONNECT_BY_ROOT使用):
select zonecode,zonename,CONNECT_BY_ROOT(zonecode) as root_code from d_zonecode
start with zonecode = '370100'
connect by prior zonecode = supercode and zonecode != supercode;
select zonecode,CONNECT_BY_ROOT(zonecode) as root_code from d_zonecode
start with zonecode = '370114'
connect by prior supercode = zonecode and zonecode != supercode;
select CONNECT_BY_ROOT(t.zonecode) as ROOT from d_zonecode t
where t.zonecode = '370100'
start with t.zonecode = t.supercode
connect by prior t.zonecode = t.supercode and t.zonecode != t.supercode;
- 大小: 21.2 KB
- 大小: 46.9 KB
- 大小: 13 KB
- 大小: 13.2 KB
- 大小: 8.7 KB
- 大小: 15.4 KB
- 大小: 24.3 KB
- 大小: 11.8 KB
- 大小: 18.2 KB
- 大小: 34.5 KB
- 大小: 8.3 KB
分享到:
相关推荐
3. **高级SQL特性**:书中涵盖了Oracle特有的SQL功能,如PL/SQL过程化语言,游标,递归查询,窗口函数,分析函数,以及在SQL中使用正则表达式等,这些高级特性为复杂的数据处理提供了强大支持。 4. **性能调优**:...
总的来说,Oracle的递归SQL是处理层次数据的强大工具,可以灵活地构建和查询树状结构。通过理解`start with`、`connect by prior`和`order siblings by`的用法,我们可以有效地展示和操作层次数据。不过,实际应用时...
### Oracle中的递归查询详解 #### 一、引言 在数据库管理中,处理具有层次结构的数据是一项常见的任务。例如,在组织结构、产品分类或文件系统等场景中,经常需要查询这种类型的层级数据。Oracle数据库提供了强大...
这里,我们将深入探讨如何使用递归查询来构建菜单树,并特别关注在MySQL和Oracle这两种广泛使用的数据库系统中的实现。 首先,我们要理解什么是递归查询。递归查询是一种在数据库中处理层次数据的方法,它通过自身...
Oracle数据库在处理树形结构数据时提供了强大的递归查询功能,这种特性对于组织结构、产品分类、层级菜单等场景的应用非常广泛。递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的...
Oracle数据库系统在处理层次数据或树形结构时,提供了强大的工具——递归查询。递归查询允许我们在数据表中处理嵌套级别的数据,这在权限查询、组织结构、产品分类等场景中尤其常见。本文将深入探讨Oracle中的树状...
在Oracle数据库中,SQL递归查询是一种非常有用的工具,它允许我们处理层级关系的数据,例如组织结构、树形目录或有上下级关联的数据。本文将详细介绍如何在Oracle中使用SQL递归语句,并通过示例进行说明。 首先,...
"OracleOracle触发器与存储过程高级编程.rar"可能涵盖触发器和存储过程的高级话题,如游标、递归、动态SQL、游标变量等。“Oracle SQL必备参考.rar”可能包含SQL查询优化、联接操作、子查询、聚合函数等方面的内容。...
在数据库查询语言中,Oracle 提供了一种强大的功能——递归查询,这在其他数据库系统如 SQL Server 中是缺失的功能。递归查询允许用户执行多级关联查询,特别适用于处理具有层次结构的数据,例如组织结构图、文件...
Oracle数据库还有许多独特的特性和功能,如物质化视图、物化查询表、递归查询、并行查询等,这些将在培训中详细阐述。 综上所述,“Oracle高级SQL培训与讲解”涵盖了Oracle SQL的广泛主题,旨在帮助学员全面掌握...
Oracle数据库和SQL Server都提供了内置的机制来支持递归查询。本文将深入讲解这两种数据库系统如何执行递归查询,并通过示例进行演示。 首先,我们来看如何获取数据库中的表名和列名。在Oracle中,你可以使用`DBA_...
### Oracle递归查询详解 #### 一、引言 在处理具有层级结构的数据时,递归查询是一项非常有用的技能。例如,在处理组织架构、产品分类等数据时,我们经常需要查询某一节点及其所有子节点或者从某个节点追溯到其根...
oracle 如何递归查询父子关系。经常用于构造树结构
Oracle 递归函数是一种特殊的PL/SQL函数,可以用于解决复杂的树形结构查询问题。递归函数可以自我调用,以便遍历树形结构的每个节点,直到达到停止条件。 在 Oracle 中,递归函数的定义语法如下所示: ```sql ...
【MySQL数据库SQL递归查询的研究与实现】 MySQL是一种广泛应用的关系型数据库管理系统,以其开源、高效和跨平台等特性,尤其适合中小型网站的部署。虽然MySQL在处理常规数据操作和查询方面表现出色,但在某些特定...
- Oracle 的 `START WITH U CONNECT BY` 用于创建层次查询,SQL Server 可以通过递归公共表表达式(CTE)或存储过程实现类似功能。 - Oracle 支持 `INTERSECT` 和 `MINUS` 集合运算符,而 SQL Server 用 `EXISTS` 和...
总之,SQL递归函数是处理层次结构数据的强大工具,通过正向递归查找子节点、反向递归查找父节点以及构建面包屑导航路径,可以灵活地处理各种树形结构的问题。掌握这些技术能够帮助我们在数据库设计和查询中更加高效...
本文将深入探讨如何通过递归查询来解决这类问题,并着重讲解使用`WITH`语句来实现递归查询的方法,适用于多种数据库系统,如MySQL、PostgreSQL、SQL Server等。 一、理解递归查询 递归查询是一种在数据库中遍历层级...
Oracle Database 10g支持层次查询,允许用户沿着层级结构进行递归查询,从而有效地提取和分析层次数据。 接着,分析查询是针对大量业务数据进行深入分析的重要工具,特别适用于数据仓库环境。随着数据库技术的发展...