Самый простой способ найти IsManager в SQL - PullRequest
0 голосов
/ 12 октября 2011

Простая структура таблицы сотрудников

Employee      Manager
Joe Smith      Jon Smith
Jon Smith      Pete Stevens
Pete Stevens   NULL
Jared Scho     Pete Stevens
....

Я просто пытаюсь вернуть некоторые результаты, но мне нужен индикатор того, является ли человек руководителем или нет, поэтому результат должен быть:

Employee       Manager      IsAManager
Joe Smith     Jon Smith         0
Jon Smith     Pete Stevens      1
Pete Stevens    NULL            1
Jared Scho    Pete Stevens      0

Результирующий набор показывает, что Джо Смит и Джаред Шо не являются менеджерами ...

Итак, если бы у меня был простой SQL-запрос

SELECT
   Employee,
   Manager,
   As IsAManager   --tried to do a case statement here....
FROM
   Employee

Я попытался сделать оператор caseчто-то на этот счет:

SELECT CASE ISNULL(COUNT(*), 0) > 0 THEN 1 ELSE 0 END FROM Employee WHERE Manager = Employee

Не знаю, как это сказать:)

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Надеюсь, это всего лишь демонстрационный пример, а не структура вашей реальной таблицы.

SELECT Employee,
       Manager,
       CASE
         WHEN EXISTS(SELECT *
                     FROM   Employee e2
                     WHERE  e2.Manager = e1.Employee) THEN 1
         ELSE 0
       END As IsAManager
FROM   Employee e1  

Подробнее о том, как SQL Server обрабатывает EXISTS Подзапросы в выражениях CASE, см. в этой статье .

1 голос
/ 12 октября 2011

Чтобы определить, является ли сотрудник руководителем, необходимо сопоставить идентификатор сотрудника (в данном случае имя) со списком идентификаторов руководителей (в данном случае столбец «Менеджер»).Если вы найдете совпадение, сотрудник является менеджером.Если вы не нашли соответствия, сотрудник не является менеджером.

Вы можете сделать это с помощью LEFT OUTER JOIN, как показано здесь:

  SELECT DISTINCT
   E.Employee,
   E.Manager,
   CASE WHEN M.Employee IS NULL THEN 0 ELSE 1 END As IsAManager  
 FROM
  Employee E LEFT OUTER JOIN Employee M
    ON E.Employee = M.Manager

Обратите внимание на следующее:

  • Вы не указали используемый продукт SQL, поэтому я попытался сделать решение общим.Из вашей попытки использовать ISNULL я догадываюсь, что это SQL Server, но это решение должно работать в любом продукте, который поддерживает CASE.
  • У вашего метода хранения статуса менеджера есть одна проблема: вы не можете представлятьменеджер без сотрудников (статус менеджера определяется на основе наличия отношений сотрудник-менеджер).Если вы хотите иметь возможность хранить статус менеджера отдельно от отношений сотрудник-менеджер, тогда CREATE TABLE Managers (Employee. . . PRIMARY KEY).Это также облегчит написание кода, необходимого для возврата статуса менеджера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...