在此工作订单表中,有多个工作订单元素。每个元素都是父元素,它在父列中为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。
答案 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)的附加索引