我们公司用的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.
请高手解答一下。
我的分全放上了。
题目是求当前日期在机种料件的有效范围内的所有最底层料件的用量。
我的写法是这样的。
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.
请高手解答一下。
我的分全放上了。
start with ... connect by ... and
你到底什么问题?
如机种
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'))
语法是整个分支都去掉的你怎么判断过期?问题在这你的AND语句的含义是
t$indt小于当前日期
且
(t$exdt大于当前日期 或者 t$exdt is null)nvl(to_char(t$exdt,'yyyy-mm-dd'),'0000-00-00')='0000-00-00') --你这个条件写复杂了把你的表记录写出来吧!和你希望的结果
具真实的例子
baan.ttibom010310
(
t$mitm varchar2 //父料号
t$pono varchar2
t$sitm varchar2 //子料号
t$indt oracle的日期 //有效期开始日期
t$exdt oracle的日期 //有效期截止日期
)
其他的字段就不管了
如果不对就是说明这个日期型的匹配有问题。不知道为什么
条件可能不能用or吧。。
and t$indt >=sysdate
and (t$exdt>=sysdate or t$exdt is null)
查询显示出来的是'0000/0/0'
所以像你那样写也是没用的。查询出来的连一个节点都去不掉了。
我那样写可以除掉一些节点,但不是预期的。至于那些节点不能删除就不知道了。
and (t$exdt<=sysdate or t$exdt ='0000/0/0')