表结构是:parentid(母编号)  id(子编号)    indt(开始日期)   exdt(结束日期)
10                1501           201101           203012
10                1204           201101           201105
10                1303           201101           203012
1204              2301           201101           202012
2301              3561           201101           202012
1303              5678           201101           201103
5678               3456          201101           202012
这个表的内容是一个简单的物料清单bom,这个清单有一个开始时间和结束时间,当输入年月的参数,把符合条件的物料过滤出来,值得注意的是如果该物料的上级物料不符合在时间范围的条件的话,其子物料也不能选择出来.,
参数年月=201106
最后得到的结果是
parentid(母编号)  id(子编号)    indt(开始日期)   exdt(结束日期)
10                1501           201101           203012
10                1303           201101           203012

解决方案 »

  1.   

    根据你的数据,你给出查询结果少了2条记录。
    实测数据:CREATE TABLE T122
    (
        ParentID VARCHAR2(20),
        ID VARCHAR2(20),
        InDt VARCHAR2(20),
        ExDt VARCHAR2(20)
    );
    INSERT INTO T122 VALUES('10', '1501', '201101', '203012');
    INSERT INTO T122 VALUES('10', '1204', '201101', '201105');
    INSERT INTO T122 VALUES('10', '1303', '201101', '203012');
    INSERT INTO T122 VALUES('1024', '2301', '201101', '202012');
    INSERT INTO T122 VALUES('2301', '3561', '201101', '203012');
    INSERT INTO T122 VALUES('1303', '5678', '201101', '201103');
    INSERT INTO T122 VALUES('5678', '3456', '201101', '202012');
    实测结果:
      

  2.   

    把你的时间条件写在connect by 里
      

  3.   

    直接把限定条件放在connect by 里就可以了。select distinct  parentid,id,indt,exdt 
    from t122
    where indt < '201106' and exdt >'201106'
    start with parentid=10
    connect by parentid=prior id 
    and indt < '201106' and exdt >'201106'
      

  4.   

    谢谢以上各位,但是我现在又碰到一个问题,
    比如说在这个bom里除了上面有个日期限定之外,增加一个数量的字段
    CREATE TABLE T122
    (
        ParentID VARCHAR2(20),
        ID VARCHAR2(20),
        qnt number,
        InDt VARCHAR2(20),
        ExDt VARCHAR2(20)
    );
    INSERT INTO T122 VALUES('10', '1501','1', '201101', '203012');
    INSERT INTO T122 VALUES('10', '1204','2', '201101', '201105');
    INSERT INTO T122 VALUES('10', '1303','1', '201101', '203012');
    INSERT INTO T122 VALUES('1204', '2301','2', '201101', '202012');
    INSERT INTO T122 VALUES('2301', '3561','1', '201101', '203012');
    INSERT INTO T122 VALUES('1303', '5678','3', '201101', '201106');
    INSERT INTO T122 VALUES('5678', '3456','3', '201101', '202012');我要把母件的数量带入到子件里,既子件的实际数量=上层母件数量*子件数量,
    最后得到的结果是按照参数年月=201106的条件得到以下的结果
    parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
    10 1501 1 201101 203012
    10 1303 2 201101 203012
    1303 5678 6 201101 201106
    5678 3456 18 201101 202012
      

  5.   

    SELECT DISTINCT parentid,id,indt,exdt  
    FROM  t122
    WHERE indt < '201106' AND  exdt >'201106'
    START WITH parentid=10
    CONNECT BY parentid=prior id  
    AND  indt < '201106' AND exdt >'201106'
      

  6.   

    bom表
    CREATE TABLE T122
    (
      ParentID VARCHAR2(20),
      ID VARCHAR2(20),
      qnt number,
      InDt VARCHAR2(20),
      ExDt VARCHAR2(20)
    );
    INSERT INTO T122 VALUES('10', '1501','1', '201101', '203012');
    INSERT INTO T122 VALUES('10', '1204','2', '201101', '201105');
    INSERT INTO T122 VALUES('10', '1303','1', '201101', '203012');
    INSERT INTO T122 VALUES('1204', '2301','2', '201101', '202012');
    INSERT INTO T122 VALUES('2301', '3561','1', '201101', '203012');
    INSERT INTO T122 VALUES('1303', '5678','3', '201101', '201106');
    INSERT INTO T122 VALUES('5678', '3456','3', '201101', '202012');我要把母件的数量带入到子件里,既子件的实际数量=上层母件数量*子件数量,
    最后得到的结果是按照参数年月=201106的条件得到以下的结果
    母编码不在有效日期里,所以其子编码也不能取到
    最后得到的结果是
    parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
    10 1501 1 201101 203012
    10 1303 2 201101 203012
    1303 5678 6 201101 201106
    5678 3456 18 201101 202012
      

  7.   

    你给的预期结果有误吧。
    10 1303 2 201101 203012这里,1303对应的数量应该是1,不是2.楼主的需求,无非是在原有列的基础上增加个计算列SELECT  parentid,id,indt,exdt ,qnt * nvl( prior qnt,1) 
    FROM  t122
    WHERE indt < '201106' AND  exdt >='201106'
    START WITH parentid=10
    CONNECT BY parentid=prior id  
    AND  indt < '201106' AND exdt >='201106'
      

  8.   

    不好意思,最后得到的结果是
    parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
    10 1501 1 201101 203012
    10 1303 1 201101 203012
    1303 5678 6 201101 201106
    5678 3456 18 201101 202012
      

  9.   

    不对啊,你这个语句得到的结果虽然按照目前给的数据是对的 ,但是实际上你是上层的数量*该下层的数量,但是再下一层就有问题了,我是要继承所有母件的数量,修改一下插入数据
    INSERT INTO T122 VALUES('10', '1501','1', '201101', '203012');
    INSERT INTO T122 VALUES('10', '1204','2', '201101', '201105');
    INSERT INTO T122 VALUES('10', '1303','2', '201101', '203012');
    INSERT INTO T122 VALUES('1204', '2301','2', '201101', '202012');
    INSERT INTO T122 VALUES('2301', '3561','1', '201101', '203012');
    INSERT INTO T122 VALUES('1303', '5678','3', '201101', '201106');
    INSERT INTO T122 VALUES('5678', '3456','3', '201101', '202012');
    parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
    10 1501 1 201101 203012
    10 1303 2 201101 203012
    1303 5678 6 201101 201106
    5678 3456 18 201101 202012
    有人再帮忙看看吗 ?谢谢了。
      

  10.   

    得到的结果是 
    parentid(母编号) id(子编号) 数量indt(开始日期) exdt(结束日期)
    10 1501 1 201101 203012
    10 1303 1 201101 203012
    1303 5678 6 201101 201106
    5678 3456 18 201101 202012
      

  11.   

    我曾记得oracle有商务智能分析函数,能进行行级的计算,找了半天没找到。
    对于你的需求,变通一下实现。先自定义一个函数:
    create or replace function f_comp(arg varchar2) return number
     is
       ls_sql varchar2(4000); 
       li_result number;
     begin
       ls_sql := 'select '||nvl(arg,'null')||' from dual';
       execute immediate ls_sql into li_result;
       return li_result;
     end;
    然后sql:
    SELECT parentid,
           id,
           indt,
           exdt,
           qnt,
           f_comp('1'||sys_connect_by_path(qnt,'*'))
      FROM t122
     WHERE indt < '201106'
       AND exdt >= '201106'
     START WITH parentid = 10
    CONNECT BY parentid = prior id
           AND indt < '201106'
           AND exdt >= '201106'
           and prior indt < '201106'
           and prior exdt >= '201106';这样写,可以计算任意多层