2014-04-11 112 views
1

在此工作顺序表中有多个工单顺序元素。每个元素可以是父列中的父元素或者是子元素。孩子将包含父母wonum。我期待实现的是有一个查询,如果状态为COMP,将选择父项。如果父元素状态为COMP,则还检索与该父元素关联的子项。我遇到的最大问题是找到合适的孩子。如果父母没有状态COMP,则不管子女状态如何,都不要将孩子包括在结果集中。查询特定结果集

工单表

wonum  parent  status  worktype 
=====  ======  ======  ======== 
1000  NULL  COMP  INSP 
1002  1000  COMP  INSP 
1005  1000  COMP  INSP 
1006  NULL  APPR  INSP 
1008  1006  COMP  INSP 
1009  1006  COMP  INSP 
1010  1006  APPR  INSP 
1011  1006  COMP  INSP 

所需的输出

wonum  parent  status  worktype 
=====  ======  ======  ======== 
1000  NULL  COMP  INSP 
1002  1000  COMP  INSP 
1005  1000  COMP  INSP 

通过该小样本数据。我有两个父母(1000和1006)。 1006仍然有APPR状态的子元素。我想查询与父母关联的父母和子女。所有的状态COMP。

+0

这是否走得更深两个级别(即比父母更多+儿童)?是否会有一个价值1002的父母呢? –

+0

它将永远是父母的子女关系。所以它最多会下降两个级别。 –

回答

1

我很惊讶这并没有得到太多的回答。从听起来,我会做所有工作订单的预查询,其中父母为空且状态为“COMP”。从这个角度来说,你有最高的工单。然后抢工单的所有儿童

select 
     yt2.* 
    from 
     (select yt.wonum 
      from YourTable yt 
      where parent is null 
      and status = 'COMP') PQ 
     JOIN YourTable yt2 
     on PQ.wonum = yt2.wonum 
     OR PQ.wonum = yt2.parent 
    order by 
     coalesce(yt2.parent, yt2.wonum), 
     case when yt2.parent is null 
      then 1 else 2 end 

因此,内部预查询会捕捉到你的工作订单1000作为顶级父为null,并且状态为“COMP”。然后根据工资单编号或父母匹配的预认证工单号再次直接返回到表格。这将为您提供任何合格的完成工单的所有行。

现在,为了保持相关的工作订单在一起,我们按顺序排列。订单的第一部分通过使用COALESCE()来表示......如果第一个参数为空,则使用第二个参数。因此,对于null的“父”记录,它将获取工作订单值1000.对于具有父值的子条目,它将获取它们的1000个父值。所以,现在你们每个家长都有各自的工作单。

最后,通过第二部分的顺序。我正在做一个案子/在这里。如果父ID值为空,那么这是整个订单的第一个条目。把IT放在第一位,然后是其他任何事情。

如需帮助优化查询,确保你的表有 (父,状态)的指数 和(wonum,母体)的额外指标

+0

是的,很简单。但目前还不清楚它是否是一个未知深度的层次结构,或者是一个简单的亲子关系。 –

+0

这很好解释。谢谢。还有一个问题我正在研究,看看它是否也适用于Oracle和DB2数据库。我不认为它至少会碰到Oracle的冲突。 –

+0

@DerekParker,我不希望在Oracle中看到任何问题,但从未使用过DB2。 – DRapp