没有内连接的递归CTE

时间:2015-03-24 07:43:52

标签: sql sql-server common-table-expression recursive-query

我想知道下面的伪查询是否可以用RTE(递归CTE)进行。 主要的想法是,查询的最后一部分(cte3,cte4)仍然会有更多的查询(cte5,cte6等),但主要的想法是:

SELECT * FROM [previous dataset result]
UNION
SELECT * FROM [full result]
WHERE statusId = [previous used status id] - 1
 id IS NOT IN (SELECT id FROM [previous dataset result])

我尝试使用INNER JOIN作为正常的RTE,但它没有给出预期的结果。带有RTE的LEFT OUTER JOIN应该给出正确的结果(理论上),但由于RTE不接受OUTER JOIN,我有点卡住了。

这是我目前正在使用的(没有递归部分的CTE):

;WITH cte AS (
    // query
), cte2 AS (
    SELECT * FROM cte
    WHERE WorkOrderStatusID = 8
    UNION
    SELECT * FROM cte
    WHERE SPStatus=9
), cte3 AS (
    SELECT * FROM cte2
    UNION
    SELECT * FROM cte
    WHERE WorkOrderStatusID=7
    AND OrderSPMovableID NOT IN (SELECT OrderSPMovableID FROM cte2)
), cte4 AS (
    SELECT * FROM cte3
    UNION
    SELECT * FROM cte
    WHERE WorkOrderStatusID=6
    AND OrderSPMovableID NOT IN (SELECT OrderSPMovableID FROM cte3)
)
SELECT * FROM cte4

任何帮助都将不胜感激。

更新: 样本数据:

Id  WorkOrderStatusID   OrderSPMovableID 
1       7                   12345
2       8                   12345
3       8                   11111
4       6                   11111
5       4                   23411
6       7                   23411
7       3                   43215
8       1                   34567
9       5                   76543

预期结果:

Id  WorkOrderStatusID   OrderSPMovableID 
2       8                   12345
3       8                   11111
6       7                   23411
7       3                   43215
8       1                   34567
9       5                   76543

因此,简而言之,从完整的数据结果来看,我希望获得具有最高WorkOrderStatusID的数据。由于实际结果将有大约20个字段,我发现group有点难以使用和验证,因此我正在采用递归CTE方法,如果可能的话。

0 个答案:

没有答案