在多个输入值上运行CTE

时间:2018-02-04 18:50:23

标签: sql recursion common-table-expression

在文章“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.

1 个答案:

答案 0 :(得分:1)

结果不是"交错"。结果是任意。如果没有order by子句,SQL可以按任何顺序返回结果集。即使在相同数据上运行两次相同的查询也可以产生不同的排序。

您需要在CTE中包含原始员工ID,然后在外部查询中使用order by

order by originalEmployeeId, depth