SQL-запрос с рекурсивным внешним ключом - PullRequest
1 голос
/ 28 ноября 2011

У меня есть таблица со столбцами EmployeeID, EmployeeName и ManagerID.ManagerID - это рекурсивный FK EmployeeID.Я пытаюсь запросить таблицу, чтобы указать имена сотрудников, которые являются менеджерами.Мой ход мыслей состоит в том, что Сотрудник будет Менеджером, если его EmployeeID также является ManagerID.Я установил ManagerID как NOT NULL, потому что этот человек будет менеджером менеджера.Когда я выполняю запрос, возвращается пустой столбец менеджера.

SELECT EmployeeName AS Manager
FROM Employee E
WHERE E.EmployeeID=E.ManagerID AND
E.ManagerID <> null

Ответы [ 3 ]

1 голос
/ 28 ноября 2011

Я заметил из комментария, что вам нужны только сотрудники, являющиеся менеджерами первой линии. Таким образом, вы можете сделать еще одно объединение, чтобы подтвердить, что не существует дополнительных подчиненных:

SELECT distinct M.*
FROM Employee m
join Employee e on e.managerid = m.employeeid
left join Employee s on s.managerid = e.employeeid
WHERE s.employeeid is null;
1 голос
/ 28 ноября 2011
SELECT EmployeeName AS Manager
FROM Employee 
WHERE EmployeeID IN 
      ( SELECT ManagerID 
        FROM Employee
        WHERE ManagerID IS NOT NULL
      )
  AND ManagerID IS NOT NULL   

или

SELECT EmployeeName AS Manager                --- show name 
FROM Employee M                               --- of any employee
WHERE EXISTS                                  --- for whom exists
      ( SELECT *                              --- at least one
        FROM Employee E                       --- employee
        WHERE M.EmployeeID = E.ManagerID      --- that is under his management
      )
  AND ManagerID IS NOT NULL                   --- and is not the "root" manager
0 голосов
/ 17 сентября 2014
WITH allfkey AS
(

    SELECT referenced_object_id,object_name(referenced_object_id) [object_name],name
    from sys.foreign_keys where parent_object_id=object_id('employee') -- put your table name here

    UNION ALL

   SELECT f.referenced_object_id,object_name(f.referenced_object_id) [object_name],f.name
    from sys.foreign_keys f join allfkey on f.parent_object_id=allfkey.referenced_object_id

)
SELECT * from allfkey
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...