过滤特定的sql结果集并垂直堆叠两个表

时间:2014-04-11 17:00:27

标签: sql-server-2008-r2

我有一个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'

我的结果集:

IMG

父母可以有多个孩子。这两者是如何联系的,父母的胜利等于孩子的父母 我要做的不是不加入桌子。但要垂直堆叠它们。我尝试过使用联盟,但我必须遵循我在这里的逻辑。如果父级的状态等于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。

1 个答案:

答案 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