我们经常会将一个比较复杂的目录树存储到一个表中。或者将一些部门存储到一个表中,而这些部门互相有隶属关系。这个时候你就会用到connect by prior start with。
connect by 是结构化查询中用到的,其基本语法是:
select ... from tablename start with 条件1
connect by prior 条件2
where 条件3;
例:
select * from table
start with org_id = 'HBHqfWGWPy'
connect by prior org_id = parent_id;
简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:
org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。
用上述语法的查询可以取得这棵树的所有记录。
其中:
条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。
条件3 是过滤条件,用于对返回的所有记录进行过滤。
例如:
没有加中start with ... connect by prior ...的查询结果:
select t.dim_id, t.pid, level
from pmcode.pmcode_fj_tree_rl t
where t.dim_id in (select b.dim_id
from pmcode.PMCODE_KPI_DIM_OD b
where b.kpi_id = 'KC0011')
结果:
DIM_ID PID LEVEL
---------------------
1024 5003 0
1070 0 0
5003 1070 0
5006 0 0
------------------------------------------------------------------------------------
增加start with ... connect by prior ...以后的结果:
select t.dim_id, t.pid, level
from pmcode.pmcode_fj_tree_rl t
where t.dim_id in (select b.dim_id
from pmcode.PMCODE_KPI_DIM_OD b
where b.kpi_id = 'KC0011')
start with t.dim_id = '1070' ----表示从dim_id = '1070'开始(也就是说1070为根节点)
connect by prior t.dim_id = t.pid; ----表示上条记录的dim_id等于本条记录的pid
结果:
DIM_ID PID LEVEL
---------------------
1070 0 1
5003 1070 2
1024 5003 3
分享到:
相关推荐
### Oracle数据库中的START WITH 和 CONNECT BY 用法详解 在Oracle数据库中,处理层次结构数据时,`START WITH` 和 `CONNECT BY` 是非常有用的两个关键字。这些关键字可以帮助我们在查询时构建出树形或者层级结构的...
### Oracle中的START WITH CONNECT BY PRIOR 用法详解 #### 一、概念介绍 在Oracle数据库中,`START WITH` 和 `CONNECT BY PRIOR` 是两个非常强大的特性,主要用于处理具有层级结构的数据。这两个特性可以帮助我们...
`START WITH...CONNECT BY PRIOR`是Oracle SQL中的一个特性,用于处理具有层级关系的数据。这个子句允许我们遍历和查询具有父子关系的数据,例如部门和其下属子部门,或者员工和他们的上级经理。 1. **START WITH...
Oracle 连接查询是指使用 START WITH 和 CONNECT BY 语句来实现递归查询的方法,这种方法可以生成树形结构的数据。在 Oracle 中,START WITH 语句用于指定递归查询的开始记录,而 CONNECT BY 语句用于指定递归查询的...
在Oracle中,`START WITH` 和 `CONNECT BY` 是进行递归查询的关键字,它们允许我们从一个特定的根节点出发,沿着预定义的关系链接遍历整个树形结构。本文将深入探讨这两个关键字的用法,并通过实例来说明其在实际...
- **START WITH**: 指定序列的起始值,默认为1。 - **NOMAXVALUE**: 表示序列没有最大值限制。 - **NOCYCLE**: 表示序列达到最大值后不再循环,如果设置了最大值且到达该值,则下一次请求将导致错误。 - **NOCACHE**...
`START WITH CONNECT BY PRIOR`用法详解 **基本语法**: ```sql SELECT * FROM table_name START WITH condition CONNECT BY PRIOR child_column = parent_column; ``` 其中: - `START WITH`: 指定查询的起始条件...
[ WHERE condition ][ [ START WITH condition ] CONNECT BY condition [ ORDER SIBLINGS BY expression ] ] ``` 其中,`START WITH`子句用于指定查询的起始节点,`CONNECT BY`子句用于指定查询的递归条件。 ...
START WITH id = some_employee_id CONNECT BY PRIOR id = manager_id; ``` 六、注意事项与优化 1. 避免无限循环:确保递归查询有一个明确的终止条件,否则可能导致无限循环。 2. 性能考虑:递归查询可能会消耗大量...
3. **SQL语句处理**:如上面的例子所示,`startswith()`可以用于检查SQL查询语句的类型。 4. **文件处理**:检查文件扩展名,以确定如何处理或解析文件内容。 5. **正则表达式补充**:虽然正则表达式能完成更复杂...
CREATE SEQUENCE 序列号的名称 INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; 3. 字段类型 Oracle 中有多种字段类型,包括 CHAR、VARCHAR2、NUMBER、DATE 等。不同的字段类型有不同的特点和使用场景...
通过学习《Beginning Oracle SQL》,读者不仅可以掌握Oracle SQL的基本用法,还能深入了解其高级特性。这对于日常工作中需要频繁与Oracle数据库打交道的人来说非常有帮助。此外,书中丰富的实例和清晰的解释也有助于...
通过理解`start with`、`connect by prior`和`order siblings by`的用法,我们可以有效地展示和操作层次数据。不过,实际应用时要注意性能优化,避免因递归深度过大而导致的问题,并考虑在模板渲染时的替代方案。
本文将详细介绍几种常用的SQL截取字符串函数及其应用场景,包括`LEFT`、`RIGHT`、`SUBSTRING`以及一些高级用法如使用`CHARINDEX`、`PATINDEX`、`REPLACE`和`STUFF`等函数来实现更复杂的字符串处理。 #### 一、基本...
其中,`START WITH`用于指定从哪个节点开始,`CONNECT BY`定义了子节点与父节点之间的关系。 1.2 Prior关键字 在`CONNECT BY`语句中,`PRIOR`关键字用于引用当前行的父行。例如,如果`parent_id`是子节点指向父...
- MySQL与SQL Server的基本用法相似,但在一些特定功能上有所不同,如SQL Server支持窗口函数,而MySQL则相对较晚引入。 2. 分区函数: - SQL Server提供`OVER`子句进行窗口函数和分区操作,如`ROW_NUMBER()`, `...
set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’ exec sp_executesql @sql 注意:在top后不能直接跟一个变量,所以在实际应用中...
在实际应用中,`CONNECT BY`通常与`START WITH`一起使用,形成如下的SQL语句: ```sql SELECT * FROM emp START WITH EMPNO = 7839 CONNECT BY PRIOR EMPNO = MGR; ``` 这段SQL将返回所有以7839号员工为根的子树...
这种查询主要依赖于`START WITH`和`CONNECT BY`子句,配合`PRIOR`关键字来定义层级关系。下面我们将深入探讨这些概念及其用法。 1. **`START WITH`条件** `START WITH`子句用于指定查询的起始点,即层次结构中的...
START WITH 1 -- 开始值 INCREMENT BY 1 -- 每次加几 CACHE 20; ``` **6. 删除表** - **语法**: `DROP TABLE tabname;` **7. 增加列** - **语法**: `ALTER TABLE tabname ADD colname coltype;` **8. 删除列*...