我有一个SQL语句
SELECT parent.wonum, parent.parent, parent.status, parent.description, child.wonum as Child_Wonum, child.parent as Child_parent, child.status as Child_status FROM (select * from max7503.dbo.workorder as w where w.parent is null and w.worktype = 'INSP' AND w.changeby = 'XLI') as parent
left JOIN
(select * from max7503.dbo.workorder as child where child.parent is not null and child.worktype = 'INSP' AND changeby = 'XLI') AS child
ON parent.wonum = child.parent
WHERE parent.status = 'COMP'
我的结果集:
父母可以有多个孩子。这两者是如何联系的,父母的胜利等于孩子的父母 我要做的不是不加入桌子。但要垂直堆叠它们。我尝试过使用联盟,但我必须遵循我在这里的逻辑。如果父级的状态等于comp,则必须是流,然后查询与该父级关联的子级。但如果父母身份不是补偿。不要查询与之关联的子项。我是sql的新手,所以任何见解都会有所帮助,谢谢。
编辑: 我想要实现的是我有一张桌子。
工单表
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)
我不确定我是否遵循了你在此之后所做的事情,但是如果你想“堆叠”记录并且它们都来自同一个表格,为什么不使用ORDER BY
:
SELECT *
FROM max7503.dbo.workorder
WHERE worktype = 'INSP'
AND changeby = 'XLI'
ORDER BY COALESCE(parent,wonum)
,parent
,wonum
如果那不是您所追求的,那么使用一些样本数据显示所需的输出会很有帮助。
更新:基于更新的问题,显然您需要JOIN
来过滤记录,最好在递归cte中完成,然后在过滤之后,您可以使用ORDER BY
来格式化输出:
;WITH cte AS (SELECT wonum, parent
FROM Table1
WHERE Status = 'COMP'
AND Parent IS NULL
UNION ALL
SELECT a.wonum, a.parent
FROM Table1 a
JOIN cte b
ON a.parent = b.wonum
WHERE Status = 'COMP')
SELECT *
FROM Table1 a
WHERE worktype = 'INSP'
AND EXISTS (SELECT *
FROM cte b
WHERE a.wonum = b.wonum)
ORDER BY COALESCE(parent,wonum)
,parent
,wonum
演示:SQL Fiddle