0

Недавно я загрузил AdventureWorks2012 для SQL Server Management Studio и нашел несколько вопросов в Интернете относительно базы данных. Я действительно застрял на одном и отчаянно нуждаюсь в каком-то руководстве;Запрос справки относительно рекурсивного запроса или CTE

Отображение управленческой иерархии от Рут Ellerbrock до генеральный директор Кен Санчес

Каждый человек в организации имеет в иерархии в OrganizationalLevel; с генеральным директором 0, вице-президентом 1, инженер-менеджером 2, старшим конструктором инструментов 3 и постепенно спускается. Самая низкая она идет в 4.

Что я делаю: Я объединения двух таблиц, [Person].[Person] И [HumanResources].[Employee] вместе, чтобы получить FirstName, LastName,JobTitle, OrganizationalLevel

Select [Person].[Person].FirstName 
    , [Person].[Person].LastName 
    , [HumanResources].[Employee].OrganizationLevel 
from [HumanResources].[Employee] 
JOIN person.person ON ([HumanResources].[Employee].[BusinessEntityID]=[Person].[Person].[BusinessEntityID]) 

Это мое понимание того, что мне нужно использовать рекурсивный запрос или общее выражение таблицы, но я действительно не знаю, как это сделать.

Любая помощь была бы очень признательна. И, пожалуйста, не стесняйтесь задавать любые вопросы для более подробной информации.

спасибо.

+0

В каком поле указывается, кто управляет кем или кто управляется кем? –

ответ

0

Как работает образец AdventureWorks, используя тип данных HierarchyId на таблице Employee - вам действительно не нужен рекурсивный CTE - обычный CTE будет делать.

Попробуйте что-то вроде этого:

-- define the CTE to get the "anchor" data - the row for Ruth Ellerbrook 
;WITH Anchor AS 
(
    SELECT 
     p.FirstName , 
     p.LastName , 
     e.OrganizationLevel, 
     e.OrganizationNode 
    FROM 
     HumanResources.Employee e 
    INNER JOIN 
     person.person p ON e.BusinessEntityID = p.BusinessEntityID 
    WHERE 
     p.FirstName = 'Ruth' 
     AND p.LastName = 'Ellerbrock' 
) 
SELECT 
    p.FirstName, 
    p.LastName, 
    e.OrganizationLevel, 
    CAST(e.OrganizationNode AS VARCHAR(20)) AS 'OrgNodeString' 
FROM 
    HumanResources.Employee e 
INNER JOIN 
    person.person p ON e.BusinessEntityID = p.BusinessEntityID 
INNER JOIN 
    Anchor a ON a.OrganizationNode.IsDescendantOf(e.OrganizationNode) = 1 

Внешняя SELECT пополнит HumanResources.Employee и Person.Person таблицы и будет получать все строки, где OrganizationNode колонна Рут Ellerbrook является потомком из другого ряда - например, он перечислит всех непосредственных начальников для Рут Эллербрук, вплоть до генерального директора.

+0

Может ли условие быть частью соединения? Почему это должно быть в предложении where? – ErikE

+0

@ErikE: право на это, конечно же, может быть условие JOIN - слишком рано утром все еще :-) Обновлен мой ответ –

Смежные вопросы