Oracle 层次查询(Connect By)

    技术2024-10-06  58

    -引用别人的表结构

    create table test_connect_by (child number,parent number);

    insert into TEST_CONNECT_BY (CHILD, PARENT)values (2, 5);insert into TEST_CONNECT_BY (CHILD, PARENT)values (3, 5);insert into TEST_CONNECT_BY (CHILD, PARENT)values (10, 15);insert into TEST_CONNECT_BY (CHILD, PARENT)values (5, 15);insert into TEST_CONNECT_BY (CHILD, PARENT)values (9, 17);insert into TEST_CONNECT_BY (CHILD, PARENT)values (8, 17);insert into TEST_CONNECT_BY (CHILD, PARENT)values (15, 38);insert into TEST_CONNECT_BY (CHILD, PARENT)values (17, 38);insert into TEST_CONNECT_BY (CHILD, PARENT)values (6, 38);insert into TEST_CONNECT_BY (CHILD, PARENT)values (13, 26);insert into TEST_CONNECT_BY (CHILD, PARENT)values (1, 26);insert into TEST_CONNECT_BY (CHILD, PARENT)values (12, 26);insert into TEST_CONNECT_BY (CHILD, PARENT)values (11, 18);insert into TEST_CONNECT_BY (CHILD, PARENT)values (7, 18);insert into TEST_CONNECT_BY (CHILD, PARENT)values (38, null);insert into TEST_CONNECT_BY (CHILD, PARENT)values (26, null);insert into TEST_CONNECT_BY (CHILD, PARENT)values (18, null);commit;

    ---------------------------------------

    select a.child,       a.parent,       level "层次",       sys_connect_by_path(child, '->') "合并层次",       prior a.child "父节点",       connect_by_root a.child "根节点",       decode(connect_by_isleaf, 1, a.child, null) "子节点",       decode(connect_by_isleaf, 1, '是', '否') "是否子节点"from test_connect_by astart with a.parent is null --从parent为空开始扫描connect by prior a.child = a.parent --以child为父列连接parentorder siblings by child desc --对层次排序;

     

     

    转贴:

    http://blog.chinaunix.net/u1/54706/showart_1711812.html

    Oracle Connect By用法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,id,name,description) values(1,2,'a1','aaa1');insert into t2(root_id,id,name,description) values(1,3,'a2','aaa2');insert into t2(root_id,id,name,description) values(0,4,'b','bbb');insert into t2(root_id,id,name,description) values(4,5,'b1','bbb1');insert into t2(root_id,id,name,description) values(4,6,'b2','bbb2');获取完整树:select * from t2 start with root_id = 0 connect by prior id = root_id; 获取特定子树: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; 如果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;如:

    今天在ITPUB看到的题目

    2、有如下信息:起始地 目的地 距离(公里)A   B   1000A   C   1100A   D   900A   E   400B   D   300D   F   600E   A   400F   G   1000C   B   600请用SQL语句或一段代码写出从A出发,可达到的目的地(包括间接方式)。

    创建表test

    SQL> select * from test;

    START_PLACE END_PLACE    DISTANCE----------- ---------- ----------A           B                1000A           C                1100A           D                 900A           E                 400B           D                 300D           F                 600E           A                 400F           G                1000C           B                 600

    select start_place, end_placefrom (select * from testwhere end_place <> 'A')start with start_place = 'A'connect by prior end_place = start_place;

    START_PLACE END_PLACE----------- ----------A           CC           BB           DD           FF           GA           DD           FF           GA           E

    这些条目中的END_PLACE就是所有可以从A到达的点

    connect by prior 实现树状查询 connect by prior 左边的为父接点,右边为自接点。

    oracle还提供函数sys_connect_by_path()可以把路径表示出来如下面语句

    select sys_connect_by_path(start_place, '->')||'->'||end_placefrom (select * from duanjw where end_place <> 'A')start with start_place = 'A'CONNECT BY PRIOR end_place = start_place;

    SYS_CONNECT_BY_PATH(START_PLAC--------------------------------------------------------------------------------->A->C->A->C->B->A->C->B->D->A->C->B->D->F->A->C->B->D->F->G->A->D->A->D->F->A->D->F->G->A->E

    这样看起来就清楚了很多

    本文来自博客,转载请标明出处:http://blog.csdn.net/xiaoduan9678/archive/2007/07/05/1680261.aspx

    最新回复(0)