BEGIN
SET NOCOUNT ON;
-- Use recursive query to list out all Employees required for a particular Manager
WITH [EMP_cte]([BusinessEntityID], [OrganizationNode], [FirstName], [LastName], [JobTitle], [RecursionLevel]) -- CTE name and columns
AS (
SELECT
e.[BusinessEntityID]
, e.[OrganizationNode]
, p.[FirstName]
, p.[LastName]
, e.[JobTitle]
, 0 -- Get the initial Employee
FROM [HumanResources].[Employee] e
INNER JOIN [Person].[Person] as p
ON p.[BusinessEntityID] = e.[BusinessEntityID]
WHERE e.[BusinessEntityID] = @BusinessEntityID
UNION ALL
SELECT
e.[BusinessEntityID]
, e.[OrganizationNode]
, p.[FirstName]
, p.[LastName]
, e.[JobTitle]
, [RecursionLevel] + 1 -- Join recursive member to anchor
FROM [HumanResources].[Employee] e
INNER JOIN [EMP_cte]
ON e.[OrganizationNode] = [EMP_cte].[OrganizationNode].GetAncestor(1)
INNER JOIN [Person].[Person] p
ON p.[BusinessEntityID] = e.[BusinessEntityID]
)
-- Join back to Employee to return the manager name
SELECT
[EMP_cte].[RecursionLevel]
, [EMP_cte].[BusinessEntityID]
, [EMP_cte].[FirstName]
, [EMP_cte].[LastName]
, [EMP_cte].[OrganizationNode].ToString() AS [OrganizationNode]
, p.[FirstName] AS 'ManagerFirstName'
, p.[LastName] AS 'ManagerLastName' -- Outer select from the CTE
FROM [EMP_cte]
INNER JOIN [HumanResources].[Employee] e
ON [EMP_cte].[OrganizationNode].GetAncestor(1) = e.[OrganizationNode]
INNER JOIN [Person].[Person] p
ON p.[BusinessEntityID] = e.[BusinessEntityID]
ORDER BY [RecursionLevel], [EMP_cte].[OrganizationNode].ToString()
OPTION (MAXRECURSION 25)
END;
如何从索引中获取列并检查select列中是否存在该列