我想知道下面的伪查询是否可以用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方法,如果可能的话。