GVKun编程网logo

除Oracle以外的RDBMS中的CONNECT BY或分层查询(oracle 除了某些字段其他数据都查询)

13

本文的目的是介绍除Oracle以外的RDBMS中的CONNECTBY或分层查询的详细情况,特别关注oracle除了某些字段其他数据都查询的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您

本文的目的是介绍除Oracle以外的RDBMS中的CONNECT BY或分层查询的详细情况,特别关注oracle 除了某些字段其他数据都查询的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解除Oracle以外的RDBMS中的CONNECT BY或分层查询的机会,同时也不会遗漏关于#ORACLE 每日一点#Oracle CONNECT BY 使用、jboss6.x – 无法将oracle.jdbc.driver.T4CConnection强制转换为oracle.jdbc.OracleConnection、Oracle connect by prior查询用法、Oracle Connect By Prior(递归查询)简洁实例的知识。

本文目录一览:

除Oracle以外的RDBMS中的CONNECT BY或分层查询(oracle 除了某些字段其他数据都查询)

除Oracle以外的RDBMS中的CONNECT BY或分层查询(oracle 除了某些字段其他数据都查询)

Oracle附带了一个非常方便的功能。您可以使用以下子句创建分层查询(递归行为):

CONNECT BY [NOCYCLE] {condition [AND condition...]} [START WITH condition]

如此处记录:

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries003.htm

我想知道,是否还存在其他支持等效或相似语法的RDBMS?还是可以使用常规SQL对这种递归行为进行一般性的模拟?

我想能够模拟的一个很好的例子是(摘自Oracle文档):

    SELECT LPAD(' ',2 * (LEVEL-1)) || last_name org_chart,employee_id,manager_id,job_id
      FROM employees
START WITH job_id = 'AD_VP' 
CONNECT BY PRIOR employee_id = manager_id;

导致:

ORG_CHART          EMPLOYEE_ID MANAGER_ID JOB_ID
------------------ ----------- ---------- ----------
Kochhar                    101        100 AD_VP
  Greenberg                108        101 FI_MGR
    Faviet                 109        108 FI_ACCOUNT
    Chen                   110        108 FI_ACCOUNT
    Sciarra                111        108 FI_ACCOUNT
    Urman                  112        108 FI_ACCOUNT
    Popp                   113        108 FI_ACCOUNT
  Whalen                   200        101 AD_ASST
  Mavris                   203        101 HR_REP
  Baer                     204        101 PR_REP
  Higgins                  205        101 AC_MGR
    Gietz                  206        205 AC_ACCOUNT
De Haan                    102        100 AD_VP
  Hunold                   103        102 IT_PROG
    Ernst                  104        103 IT_PROG
    Austin                 105        103 IT_PROG
    Pataballa              106        103 IT_PROG
    Lorentz                107        103 IT_PROG

LEVEL用它来实现伪列和压痕对我来说并不那么重要

#ORACLE 每日一点#Oracle CONNECT BY 使用

#ORACLE 每日一点#Oracle CONNECT BY 使用

oracle “connect by”是层次查询子句,一般用于树状或者层次结果集的查询。其语法是: [ START WITHcondition ]CONNECT BY [ NOCYCLE ] condition The start with .. connect by clause can be used to select data that has a hierarchical relationship (

oracle “connect by”是层次查询子句,一般用于树状或者层次结果集的查询。其语法是:

[ START WITHcondition ]
CONNECT BY [ NOCYCLE ] condition 

登录后复制

 

The start with .. connect by clause can be used to select data that has a hierarchical relationship (usually some sort of parent->child (boss->employee or thing->parts). 

说明:
1. START WITH:告诉系统以哪个节点作为根结点开始查找并构造结果集,该节点即为返回记录中的最高节点。
2. 当分层查询中存在上下层互为父子节点的情况时,会返回ORA-01436错误。此时,需要在connect by后面加上NOCYCLE关键字。同时,可用connect_by_iscycle伪列定位出存在互为父子循环的具体节点。 connect_by_iscycle必须要跟关键字NOCYCLE结合起来使用

接下来,用一些示例来说明“CONNECT BY”的用法。

 

例1

创建一个部门表,这个表有三个字段,分别对应部门ID,部门名称,以及上级部门ID

-- Create table 
create table DEP 
( 
  DEPID      number(10)notnull,
  DEPNAME    varchar2(256),
  UPPERDEPID number(10)
) 
; 

登录后复制

 

初始化一些数据

SQL> INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID)VALUES(0,''总经办'',null);
1 row inserted 
  
SQL> INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID)VALUES(1,''开发部'', 0);
1 row inserted 
  
SQL> INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID)VALUES(2,''测试部'', 0);
1 row inserted 
  
SQL> INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID)VALUES(3,''Sever开发部'', 1);
1 row inserted 
  
SQL> INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID)VALUES(4,''Client开发部'', 1);
1 row inserted 
  
SQL> INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID)VALUES(5,''TA测试部'', 2);
1 row inserted 
  
SQL> INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID)VALUES(6,''项目测试部'', 2);
1 row inserted 
  
SQL> commit;
Commit complete 

登录后复制
SQL> SELECT * FROM DEP; 
  
      DEPID DEPNAME                                                                           UPPERDEPID
----------- -------------------------------------------------------------------------------- -----------
          0 General Deparment                                                                
          1 Development                                                                                0
          2 QA                                                                                         0
          3 Server Development                                                                         1
          4 Client Development                                                                         1
          5 TA                                                                                         2
          6 Porject QA                                                                                 2
  
7 rowsselected 

登录后复制


现在我要根据“CONNECT BY”来实现树状查询结果

 

SQL> SELECT RPAD('' '', 2*(LEVEL-1),''-'') || DEPNAME "DEPNAME",
CONNECT_BY_ROOT DEPNAME "ROOT",
CONNECT_BY_ISLEAF "ISLEAF", 
LEVEL , 
SYS_CONNECT_BY_PATH(DEPNAME,''/'')"PATH"
FROM DEP 
START WITH UPPERDEPID IS NULL
CONNECT BY PRIOR DEPID = UPPERDEPID;
  
DEPNAME                        ROOT                    ISLEAF     LEVELPATH
------------------------------ ------------------- ---------- ---------- --------------------------------------------------------------------------------
General Deparment              General Deparment            0          1 /General Deparment
 -Development                  General Deparment            0          2 /General Deparment/Development
 ---Server Development         General Deparment            1          3 /General Deparment/Development/Server Development
 ---Client Development         General Deparment            1          3 /General Deparment/Development/Client Development
 -QA                           General Deparment            0          2 /General Deparment/QA
 ---TA                         General Deparment            1          3 /General Deparment/QA/TA
 ---Porject QA                 General Deparment            1          3 /General Deparment/QA/Porject QA
                                                     
7 rowsselected 

登录后复制

 

1. CONNECT_BY_ROOT 返回当前节点的最顶端节点
2. CONNECT_BY_ISLEAF 判断是否为叶子节点,如果这个节点下面有子节点,则不为叶子节点
3. LEVEL 伪列表示节点深度
4. SYS_CONNECT_BY_PATH函数显示详细路径,并用“/”分隔

例2

通过CONNECT BY生成序列

SQL&gt; SELEC TROWNUM FROM DUAL CONNECT BY ROWNUM <br><p><strong><span>例3</span></strong></p>
<p>通过CONNECT BY用于十六进度转换为十进制</p>
<p>
</p><p>
</p><p></p><pre>CREATE OR REPLACE FUNCTION f_hex_to_dec(p_strINVARCHAR2)RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_hex_to_dec
    -- 对象描述: 十六进制转换十进制
    -- 输入参数: p_str 十六进制字符串
    -- 返回结果: 十进制字符串
    -- 测试用例: SELECT f_hex_to_dec(''78A'') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return  VARCHAR2(4000);
  BEGIN
    SELECT SUM(DATA)INTO v_return
      FROM(SELECT (CASEupper(substr(p_str, rownum, 1))
                     WHEN''A''THEN''10''
                     WHEN''B''THEN''11''
                     WHEN''C''THEN''12''
                     WHEN''D''THEN''13''
                     WHEN''E''THEN''14''
                     WHEN''F''THEN''15''
                     ELSE substr(p_str, rownum, 1)
                   END) * power(16, length(p_str) - rownum) DATA
              FROM dual
            CONNECT BY rownum <br><blockquote>
说明:
1. CONNECT BY rownum </blockquote>
<br><br><p><br></p>
登录后复制

jboss6.x – 无法将oracle.jdbc.driver.T4CConnection强制转换为oracle.jdbc.OracleConnection

jboss6.x – 无法将oracle.jdbc.driver.T4CConnection强制转换为oracle.jdbc.OracleConnection

WrappedConnectionJDK6 wrapped = (WrappedConnectionJDK6) dbStrategy.getConnection();
            Connection underlyingConn = wrapped.getUnderlyingConnection();
            OracleConnection oracleConn = (OracleConnection)underlyingConn;

最后一行给出错误 –

> ERROR
> [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/web].[resteasy-servlet]]
> (http-/0.0.0.0:8080-1) Servlet.service() for servlet resteasy-servlet
> threw exception: org.jboss.resteasy.spi.UnhandledException:
> java.lang.classCastException: oracle.jdbc.driver.T4CConnection cannot
> be cast to oracle.jdbc.OracleConnection
AFAIK T4CConnection应该实现oracle.jdbc.OracleConnection.
恕我直言你有2个驱动程序实现,一个在app服务器上,一个在你的项目依赖项中,必须有一个类加载问题,因为检索到的驱动程序实现由共享类加载器加载,你试图将它转换为webApp加载的类类加载器.

您可以确保您的Web应用程序依赖项与服务器提供的实现相同,或者在打包时仅从Web应用程序中排除依赖项.

如果你正在使用maven,只需将范围设置为提供.

Oracle connect by prior查询用法

Oracle connect by prior查询用法

参考地址:https://blog.csdn.net/qq_33656602/article/details/77750576

 

如果表中存在层次数据,则可以使用层次化查询子句查询出表中行记录之间的层次关系
基本语法: 
[ START WITH CONDITION1 ]
CONNECT BY [ NOCYCLE ] CONDITION2
[ NOCYCLE ]
 

用法示例:

SELECT t.* FROM Score_Model t WHERE t.id = 552 OR t.pid = 552

 

SELECT t.* FROM Score_Model t START WITH t.id = 552 CONNECT BY PRIOR t.id = t.pid

 

SELECT t.* FROM Score_Model t START WITH t.id = 553 CONNECT BY t.id = PRIOR t.pid

 

SELECT t.* FROM Score_Model t START WITH t.id = 554 CONNECT BY t.id = PRIOR t.pid

Oracle Connect By Prior(递归查询)简洁实例

Oracle Connect By Prior(递归查询)简洁实例

oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是:

select ... from <TableName>
where <Conditional-1>
start with <Conditional-2>
connect by <Conditional-3>
;

<Conditional-1>:过滤条件,用于对返回的所有记录进行过滤。
<Conditional-2>:查询结果重起始根结点的限定条件。
<Conditional-3>:连接条件

例如:

数据库表结构如下:

create table t2(
root_id number,
id number,
name varchar(5),
description varchar(10)
);

insert into t2(root_id,id,name,description) values(0,1,'a','aaa');
insert into t2(root_id,description) values(1,2,'a1','aaa1');
insert into t2(root_id,3,'a2','aaa2');
insert into t2(root_id,4,'b','bbb');
insert into t2(root_id,description) values(4,5,'b1','bbb1');
insert into t2(root_id,6,'b2','bbb2');

如图:



1.获取完整树:

select * from t2;
select * from t2 start with root_id = 0 connect by prior id = root_id;



2.获取特定子树:
select * from t2 start with id = 1 connect by prior id = root_id;



select * from t2 start with id = 4 connect by prior id = root_id;


3.如果connect by prior中的prior被省略,则查询将不进行深层递归。
如:
select * from t2 start with root_id = 0 connect by id = root_id;



select * from t2 start with id = 1 connect by id = root_id;


总结:
1、start with id= 是定义起始节点(种子),可以是id也可以是root_id,定义为root_Id查询该节点下所有的树结构,定义为id(子节点)则查询指定的树
2、connect by prior :prior的含义为先前,前一条记录。prior id=root_id 也就是前一条记录
的id等于当前记录的root_id(父id)
3、可以向下或者向上查找
4、level字段为oracle特有的层级字段,可以通过level字段查询指定的层级
select root_id,level from t2 where level=1
start with root_id = 0
connect by prior id = root_id;

关于除Oracle以外的RDBMS中的CONNECT BY或分层查询oracle 除了某些字段其他数据都查询的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于#ORACLE 每日一点#Oracle CONNECT BY 使用、jboss6.x – 无法将oracle.jdbc.driver.T4CConnection强制转换为oracle.jdbc.OracleConnection、Oracle connect by prior查询用法、Oracle Connect By Prior(递归查询)简洁实例的相关知识,请在本站寻找。

本文标签: