用法实例:
Basically if table has one row, we can get what we expected.
If more than one rows, totally mass and we need to use distinct to get what we want.
But if the table has many rows, it will be very slow.
Below is the test sql for your references:
create table test(id int, a int, b int);
insert into test values(1,5,8);
-- we are expecting 4 rows of 5,6,7,8, below sql can do
select id,a,b, a+level-1 from test connect by level<=b-a+1;
-- add one more row to the table
insert into test values(2,10,13);
-- we are expecting 4 rows of 5,6,7,8 and 4 rows of 10,11,12,13, so totally 8
-- below sql works but without distinct got 30 rows
select distinct id,a,b, a+level-1 c from test connect by level<=b-a+1 order by a, c;
-- if we add many rows to table, above sql will run forever, i think due to too much connect by and distinct
insert into test select rownum+2,rownum, rownum+3 from dual connect by level<=1000;
select distinct id,a,b, a+level-1 c from test connect by level<=b-a+1 order by a, c; -- run forever
-- here comes a interesting sql i noticed from internet, it works well and also very quick
-- any idea about it, i can not understand
-- i guess the key point is what does CONNECT BY exactly do in ORACLE
select id,a,b,a+level-1 c from test connect by level<=b-a+1 and prior id=id and prior dbms_random.value is not null order by a,c;
表结构:
pm_ci ci_id stu_ids
1 1,2,3,4
2 1,4
查询结果为:
1 1
1 2
1 3
1 4
2 1
2 4
其中需要注意正则表达式的用法
SELECT ci_id, regexp_substr(stu_ids, '[^,]+', 1, level) stu_id, level
FROM pm_ci
CONNECT BY level <= length(regexp_replace(stu_ids, '[^,]+')) + 1
and PRIOR ci_id = ci_id
AND PRIOR dbms_random.value is not null
order by ci_id asc, stu_id asc
oracle的行列转换函数:wm_concat
select t.pay_orderno,
wm_concat(t.agent_orderno) ordernolist,
count(*) countnum
from eir_pay t
where t.pay_orderno is not null
group by pay_orderno
having count(*) > 2
查询一个订单号对应的多个业务号
另外oracle的分析函数 lag和lead 也可实现某些特殊的需求
分享到:
相关推荐
"Connect By的使用探索" Connect By是一种递归查询语句,用于实现树形结构的查询和遍历。它是 Oracle 数据库中的一种特色语句,能够高效地查询树形结构的数据。 Connect By的基本语法 Connect By语句的基本语法...
在Oracle数据库中,`CONNECT BY` 是一个非常重要的SQL语法,用于构建层次查询,它能够帮助我们处理具有层级关系的数据,比如组织结构、产品分类、树形菜单等。`CONNECT BY` 查询允许从一个表中抽取数据,并按照指定...
在实际应用中,`CONNECT BY`可以与其他SQL功能结合使用,如`WHERE`子句筛选特定层级、`ORDER BY`控制输出顺序,甚至与PL/SQL一起构建复杂的业务逻辑。熟练掌握`CONNECT BY`和`LEVEL`,能够让你在处理层级数据时...
使用 START WITH 和 CONNECT BY 子句可以实现 SQL 的层次查询,并且可以使用 SYS_CONNECT_BY_PATH 函数和 CONNECT_BY_ROOT、CONNECT_BY_ISLEAF、CONNECT_BY_ISCYCLE 等伪列函数来增强层次查询的能力。
### Oracle的Connect By使用示例 #### 一、引言 在关系数据库系统中,进行树状或层次结构数据查询时经常会遇到复杂性问题。Oracle数据库通过提供`START WITH...CONNECT BY`语句来简化这类查询操作。此功能最早出现...
### Connect By Prior 数据库树的应用 #### 概述 在关系型数据库中,尤其是在 Oracle 数据库环境下,构建和查询层次结构数据是一项常见的需求。通过使用 `Connect By Prior` 存储过程,我们可以有效地处理这类问题...
### Oracle中的Connect By Prior递归算法详解 #### 一、Connect By Prior 子句概述 在Oracle数据库中,`Connect By Prior`子句是一种非常有用的工具,尤其在处理具有层次结构的数据时。它允许用户以一种简洁的方式...
在SQL查询中,`CONNECT BY PRIOR`的语法结构如下: ```sql SELECT ... FROM tablename START WITH condition_1 CONNECT BY PRIOR condition_2 WHERE condition_3; ``` 1. `START WITH`子句定义了树结构的起点,也...
### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...
文章中给出了一个名为`t_test_connectby`的数据表例子,其中包含父子关系的节点数据。通过该表,我们可以更直观地了解Connect By的执行过程。 - 不指定起始条件时,使用`CONNECT BY`: ```sql SELECT * FROM t_test...
### Oracle中的START WITH CONNECT BY PRIOR 用法详解 #### 一、概念介绍 在Oracle数据库中,`START WITH` 和 `CONNECT BY PRIOR` 是两个非常强大的特性,主要用于处理具有层级结构的数据。这两个特性可以帮助我们...
在SQL查询中,`START WITH` 和 `CONNECT BY` 是两个关键的子句,它们用于构建层次结构查询,通常在处理具有上下级关系的数据时非常有用,如员工与经理的关系、组织结构或者产品分类等。这两个子句是Oracle数据库特有...
### 将 CONNECT BY 移植到 DB2:详解与实践 #### 概述 本文旨在指导读者如何将 Oracle 数据库中的 `CONNECT BY` 语法及其相关的伪列转换为适用于 IBM DB2 Universal Database (DB2 UDB) for Linux、UNIX 和 Windows...
本篇文章将通过Oracle数据库中的`CONNECT BY`特性来实现这一需求。 #### 1. 理解CONNECT BY `CONNECT BY`是Oracle提供的一种特殊查询方法,用于处理层次结构的数据。它基于一个称为“连接路径”的概念,允许用户...
可以看到,Oracle的SELECT语句支持更多的子句,例如START WITH U CONNECT BY、INTERSECT和MINUS等。这些子句在SqlServer中不支持,但是可以使用其他方式实现相同的结果。 二、函数和过程 Oracle和SqlServer都支持...
在Oracle中,我们可以利用`CONNECT BY`和`SYS_CONNECT_BY_PATH`函数来实现这个目标。`CONNECT BY`用于建立树形连接,而`SYS_CONNECT_BY_PATH`则可以沿着这些连接路径收集数据。 以下是一个详细的步骤解释: 1. ...
START WITH U CONNECT BY {...} ``` - **SQL Server:** SQL Server提供了类似的SELECT语句结构,但并不支持`START WITH ... CONNECT BY` 子句。为了实现层次结构查询,可以使用递归公共表表达式(Recursive CTEs...
开发遇到一个报错 ORA-01436: CONNECT BY loop in user data (ORA-01436: 用户数据中的 CONNECT BY 循环)。 1. 报错原因 根据网上的资料,产生这个错误的原因是数据形成了循环。例如下面这个语句: SELECT r1....
此问题通常是由于 PL/SQL Developer 的配置不当或者使用的 Oracle 客户端版本较低,不支持 `Connect By` 功能。 #### 三、解决步骤 本文将详细介绍如何解决以上问题,并提供了一键解决方法,即通过下载并正确配置 ...
1. **链式操作**:通过一系列的链式调用,如`Select()`, `From()`, `Where()`, `Join()`, `GroupBy()`, `Having()`, `OrderBy()`, 和 `Limit()`等,可以轻松构建各种类型的SQL语句。这种模式使得代码更加整洁,易于...