在文章“Simple Recursion in SQL with Common Table Expressions”中, Douglas Kline 显示了如何递归查询Employee表中给定"Boss of"
的{{1}}。
例如,我可以使用以下查询来获取ID为16的Employee的递归员工列表:
Employee
这将返回:
WITH EmployeeAndTheirBosses
(EmployeeID,
LastName,
ReportsTo,
BossLastName,
depth)
AS
(
SELECT EmployeeID,
LastName,
ReportsTo,
LastName,
0
FROM Employee
WHERE EmployeeID = 16
UNION ALL
SELECT Employee.EmployeeID,
Employee.LastName,
Employee.ReportsTo,
EmployeeAndTheirBosses.LastName,
EmployeeAndTheirBosses.depth + 1
FROM Employee
JOIN EmployeeAndTheirBosses ON Employee.EmployeeID = EmployeeAndTheirBosses.ReportsTo
)
SELECT *
FROM EmployeeAndTheirBosses
ORDER BY depth
如何查询同一查询中的多个16, ReportsTo 6,
6, ReportsTo 2,
2, ReportsTo null.
值,结果会一个接一个地列出?
E.g。第一个SELECT中的WHERE子句类似于:
EmployeeID
结果将是:
WHERE EmployeeID in (16, 34)
修改:
好的,根据戈登的回答,我提出了以下问题。我发现奇怪的是在第一个select语句中使用了两次相同的列名。
34, ReportsTo 5,
5, ReportsTo 2,
2, ReportsTo null.
16, ReportsTo 6,
6, ReportsTo 2,
2, ReportsTo null.
答案 0 :(得分:1)
结果不是"交错"。结果是任意。如果没有order by
子句,SQL可以按任何顺序返回结果集。即使在相同数据上运行两次相同的查询也可以产生不同的排序。
您需要在CTE中包含原始员工ID,然后在外部查询中使用order by
:
order by originalEmployeeId, depth