现在有3张表
表A 账单表 :    账单信息 商户代码
表B 商户表:     商户ID   商户父ID  商户名称 商户代码  (有上下级关系,比如中国联通-北京联通-海淀区联通)
表C 商户人员表: 商户ID   人员ID有这么一个需求,根据人员ID,查询出商户包括下级商户的所有账单信息.
我考虑是这么操作:
1/根据人员ID,查询出商户ID,包括下级商户的所有ID,商户代码.2/根据商户代码查询出账单信息.
对于第一步,我如何通过一个sql语句,能够循环查出所有的下级ID.

解决方案 »

  1.   

    对于第一步,我如何通过一个sql语句,能够循环查出所有的下级ID.
    connect by 
      

  2.   

    参考此例:--1.Hierarchical Queries: START WITH and CONNECT BY PRIOR clauses 
    --Hierarchical Queries
    --START WITH and CONNECT BY PRIOR clauses.SELECT employee_id, manager_id, first_name, last_name
    FROM employee_jh
    START WITH employee_id = 1
    CONNECT BY PRIOR employee_id = manager_id;EMPLOYEE_ID MANAGER_ID FIRST_NAME LAST_NAME
    ----------- ---------- ---------- ----------
              1          0 James      Smith
              2          1 Ron        Johnson
              3          2 Fred       Hobbs
              5          2 Rob        Green
              4          1 Susan      Jones
              6          4 Jane       Brown
              9          6 Henry      Heyson
              7          4 John       Grey
              8          7 Jean       Blue
             10          1 Kevin      Black
             11         10 Keith      Long
             12         10 Frank      Howard
             13         10 Doreen     Penn13 rows selected.--2.Using a Subquery in a START WITH Clause
    SELECT LEVEL,
           LPAD(' ', 2 * LEVEL - 1) || first_name || ' ' || last_name AS employee
    FROM employee_jh
    START WITH employee_id = (SELECT employee_id FROM employee_jh WHERE first_name = 'Kevin' AND last_name = 'Black')
    CONNECT BY PRIOR employee_id = manager_id;     LEVEL EMPLOYEE
    ---------- -------------------------
             1  Kevin Black
             2    Keith Long
             2    Frank Howard
             2    Doreen Penn--3.Including Other Conditions in a Hierarchical Query
    SELECT LEVEL,
           LPAD(' ', 2 * LEVEL - 1) || first_name || ' ' ||
           last_name AS employee, salary
    FROM employee_jh
    WHERE salary <= 50000
    START WITH employee_id = 1
    CONNECT BY PRIOR employee_id = manager_id;     LEVEL EMPLOYEE                      SALARY
    ---------- ------------------------- ----------
             3      Rob Green                 40000
             3      Jane Brown                45000
             4        Henry Heyson            30000
             3      John Grey                 30000
             4        Jean Blue               29000
             3      Keith Long                50000
             3      Frank Howard              45000
             3      Doreen Penn               470008 rows selected.
      

  3.   

    上面查询的原始数据如下:
    CREATE TABLE employee_jh (
      employee_id INTEGER,
      manager_id INTEGER,
      first_name VARCHAR2(10) NOT NULL,
      last_name VARCHAR2(10) NOT NULL,
      title VARCHAR2(20),
      salary NUMBER(6, 0)
    );insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 1 , 0 , 'James' , 'Smith'  ,'CEO'            ,800000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 2 , 1 , 'Ron'   , 'Johnson','Sales Manager'  ,600000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 3 , 2 , 'Fred'  , 'Hobbs'  ,'Sales Person'   ,200000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 4 , 1 , 'Susan' , 'Jones'  ,'Support Manager',500000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 5 , 2 , 'Rob'   , 'Green'  ,'Sales Person'   ,40000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 6 , 4 , 'Jane'  , 'Brown'  ,'Support Person' ,45000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 7 , 4 , 'John'  , 'Grey'   ,'Support Manager',30000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 8 , 7 , 'Jean'  , 'Blue'   ,'Support Person' ,29000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 9 , 6 , 'Henry' , 'Heyson' ,'Support Person' ,30000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 10, 1 , 'Kevin' , 'Black'  ,'Ops Manager'    ,100000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 11, 10, 'Keith' , 'Long'   ,'Ops Person'     ,50000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 12, 10, 'Frank' , 'Howard' ,'Ops Person'     ,45000);
    insert into employee_jh (EMPLOYEE_ID, MANAGER_ID,FIRST_NAME,LAST_NAME,TITLE,SALARY) values( 13, 10, 'Doreen', 'Penn'   ,'Ops Person'     ,47000);