我们公司用的Baan系统。希望高手赐条语句。
题目是求当前日期在机种料件的有效范围内的所有最底层料件的用量。
我的写法是这样的。
Select t$mitm,t$sitm,t$indt,t$exdt,t$qana,level from baan.ttibom010310 
connect by prior t$mitm=t$sitm and (t$indt<=sysdate 
and (t$exdt>=sysdate or nvl(to_char(t$exdt,'yyyy-mm-dd'),'0000-00-00')='0000-00-00'))
start with t$mitm='MS-0000019AD'
本来以为这样查询出来的结果是,所有在有效范围内的料件和制造件
(说明一下如果某制造件不在有效期范围内,
那么他所在的子树应该不在我要范围内,哪怕他用到的某一个料件或制造件没有修改过来有效期)
但是我这样的查询结果跟我同事使用递归查询出来的结果不一样。我的查询出来的多了很多料件。
好像就是条件查询出来只是删除了某一个节点,而不是整个分支。
但是我在网上查找到的都说条件放在connect by 后面是删除整个分支,放在where后面是删除某一个节点。
我们用的是oracle8i.
请高手解答一下。
我的分全放上了。

解决方案 »

  1.   

    你这样写,不符合条件的分支都不会出现的啊!我刚试了
    start with ... connect by ... and 
    你到底什么问题?
      

  2.   

    是啊。就是希望不符合条件的分支都删除掉。
    如机种
                              A
                         /  \
                       A1    A2
                     /   \   / \
                    A11 A12 A21 A22
                   /  \         /  \
                  A111 A112    A221 A222
    现在,A2有限期过了。哪么树就只有A和A1下的节点
    假如正好A11也过期了 哪么树就只有A A1 A12节点了。
    我用上面的语句好像不是这样的结果。
    因为我同事没有connect by 语句。是用递归写的。我的结果比他的结果多了好多料件。
    不知道这个条件有什么不妥and (t$indt <=sysdate  
    and (t$exdt>=sysdate or nvl(to_char(t$exdt,'yyyy-mm-dd'),'0000-00-00')='0000-00-00'))  
      

  3.   

    不是你要的结果说明AND 条件写错了。
    语法是整个分支都去掉的你怎么判断过期?问题在这你的AND语句的含义是
    t$indt小于当前日期

    (t$exdt大于当前日期 或者 t$exdt is null)nvl(to_char(t$exdt,'yyyy-mm-dd'),'0000-00-00')='0000-00-00') --你这个条件写复杂了把你的表记录写出来吧!和你希望的结果
    具真实的例子
      

  4.   

    表结构是
    baan.ttibom010310
    (
      t$mitm varchar2   //父料号
      t$pono varchar2
      t$sitm varchar2   //子料号
      t$indt oracle的日期 //有效期开始日期
      t$exdt oracle的日期 //有效期截止日期
    )
    其他的字段就不管了
    如果不对就是说明这个日期型的匹配有问题。不知道为什么
    条件可能不能用or吧。。
      

  5.   

    t$exdt is null算有效
    and t$indt  >=sysdate  
    and (t$exdt>=sysdate or t$exdt is null) 
      

  6.   

    数据库里面保存的t$exdt不知道是什么东东。做nvl处理有可以,但用is null的条件又不行
    查询显示出来的是'0000/0/0'
    所以像你那样写也是没用的。查询出来的连一个节点都去不掉了。
    我那样写可以除掉一些节点,但不是预期的。至于那些节点不能删除就不知道了。
      

  7.   

    and t$indt  >=sysdate  
    and (t$exdt<=sysdate or t$exdt ='0000/0/0')