怎么查???

解决方案 »

  1.   

    树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如 EMP 表中的 EMPNO 和 MGR 。 EMPNO 表示该雇员的编号, MGR 表示领导该雇员的人的编号,即子节点的 MGR 值等于父节点的 EMPNO 值。在表的每一行中都有一个表示父节点的 MGR (除根节点外),通过每个节点的父节点,就可以确定整个树结构。 在 SELECT 命令中使用 CONNECT BY 和 START WITH 子句可以查询表中的树型结构关系。其命令格式如下: SELECT  CONNECT BY {PRIOR 列名 1= 列名 2| 列名 1=PRIOR 裂名 2} [START WITH] ; 其中: CONNECT BY 子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。 PRIORY 运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系, PRIOR 运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达 式。 START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。 START WITH: 不但可以指定一个根节点,还可以指定多个根节点。 该项目中有Filter表 
    存有字段: 
    FILTERID 
    CONNECTIVE_TYPE 
    COLUMN_NAME 
    OP_TYPE 
    COMPARABLE_VALUE 
    PARENT_FILTER_ID 查询: 
    Java代码
    SELECT filter_id, connective_type, column_name, op_type, camparable_value, parent_filter_id  
    FROM tidm_evt_filter  
    CONNECT BY PRIOR filter_id = parent_filter_id  
    START WITH filter_id = 'xxx'  删除 
    Java代码
    DELETE FROM tidm_evt_filter  
    WHERE FILTER_ID  
    in(  
        SELECT filter_id FROM tidm_evt_filter  
        CONNECT BY PRIOR filter_id = parent_filter_id  
        START WITH filter_id = 'xxx'  

    select count(f.id) from phl_pic_file f, ( 
    select id from phl_group where create_at between
    to_date('2009-12-01 00:00:01','yyyy-mm-dd hh24:mi:ss') 
    and to_date('2009-12-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss') 
    and category_id in (
    select distinct id from phl_category 
    connect by prior id=parent_id
    start with parent_id = 28) ) b where f.photo_id = b.id;
      

  2.   

    SQL> SELECT lpad(' ',3*(LEVEL-1),' ')||ename emptree FROM emp
      2  START WITH mgr IS NULL CONNECT BY mgr=PRIOR empno;EMPTREE
    --------------------------------------------------------------------------------KING
       JONES
          SCOTT
             ADAMS
          FORD
             SMITH
       BLAKE
          ALLEN
          WARD
          MARTIN
          TURNEREMPTREE
    --------------------------------------------------------------------------------      JAMES
       CLARK
          MILLER已选择14行。SQL>
    start with  --树起点connect by  --父子节点连接条件
      

  3.   

    上述已经很明确,对于ORACLE的树结构就是用一个字段取引用父亲节点,我简单说下,并说下给予数据结构的一种新查询方式:
    1、树结构根据一个节点向下递归(这个是比较慢的,因为向下递归往往每层可以找到对个对象,而且每次基本是FULL SCAN,如果数据量超过10W就会显得比较慢了,不过在这种结构下只能这样查找):
    SELECT *
     FROM <table_name>
     START WITH <节点标识字段>=[:传入参数值]
     CONNECT BY PRIOR <节点标识字段> = <父亲节点标识字段>;2、向上递归,由于节点标识往往都是PK,所以向上递归往往是比较快的:
    SELECT *
     FROM <table_name>
     START WITH <节点标识字段>=[:传入参数值]
     CONNECT BY PRIOR <父亲节点标识字段> = <节点标识字段>;3、创建基于查询的树结构,使得查询变得简单方便,而且不适用递归查询,在其上建立一个索引将会得到迅速扫描:
    模拟结构:
    -----------------------------------------------------------
    节点标识      父亲节点标识                 所有父亲节点标识
    -----------------------------------------------------------
    001         NULL                     {001}
    002         001                      {001}{002}
    003         003                      {001}{003}
    004         002                      {001}{002}{004}
    ...
    009         004                      {001}{002}{004}{009}
    ....对于所有父亲节点标识,创建索引查询(可以是唯一性索引),在这个查询中,不论是向上递归还是向下递归都是用一个LIKE就可以搞定,此时程序传入的就是:“所有父亲节点”,如现在传入的是节点002:的这个字段:{001}{002},此时如果要向下递归就是:
    SELECT *
    FROM <table_name>
    WHERE <所有父亲节点名称>  LIKE <传入参数>||'%';
    向上递归就是:
    SELECT *
    FROM <table_name>
    WHERE <传入参数> LIKE <所有父亲节点名称>||'%';很简单方便,这个在接触过的很多项目中效率上也显示出很大优势。