查询特定结果集

时间:2014-04-11 20:22:57

标签: mysql sql

在此工作订单表中,有多个工作订单元素。每个元素都是父元素,它在父列中为null或子元素。孩子将包含父母的遗嘱。我想要实现的是有一个查询,如果状态为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。

1 个答案:

答案 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,因为顶级父级为空且状态为“COMP'”。接下来,根据工作订单编号或父匹配的预先认证的工单号,再次直接返回到您的表。这将为您提供任何合格的已完成工单的所有行。

现在,为了将相关的工单保持在一起,我们有了订单。订单的第一部分使用COALESCE()表示......如果第一个参数为null,则使用第二个参数。所以,对于"父母"记录为null,它将获取工作订单值1000.对于具有父值的子条目,它将获取其1000个父值。因此,现在每个父母都有各自的工作单。

最后,订单的第二部分由。我在这里做案件。如果父ID值为null,则这是整个订单的第一个条目。把IT放在第一位置,然后是其他任何东西。

有关优化查询的帮助,请确保您的表具有索引 (父母,身份) 和(wonum,parent)的附加索引