Intereting Posts
IF-ELSE Альтернатива для множественных критериев SQL для использования в BIRT Лучшее представление реляционной базы данных временных привязок Teradata: Как создать резервную копию таблицы, в которой используется столбец идентификатора? Динамическое добавление нулевых записей для последующих точек доступа для работы аналитической функции LINQ to SQL SOUNDEX – возможно? Как анализировать XML-файл в Oracle SQL Может ли H2 Database запросить файл CSV, содержащий несколько разделов разных групп записей? Выполнение общего количества по сгруппированным записям в таблице Вставка нескольких строк с инкрементным первичным ключом sql Как использовать переменную tablename для готового оператора java insert Синхронизация данных в двух таблицах базы данных после удаления Oracle sql merge для вставки и удаления, но не обновления Дублировать (повторять) строки в результате выполнения sql-запроса Что означают значки столбца workbench для mysql MySQL оптимизирует скорость INSERT замедление из-за индексов

Самый простой способ найти IsManager в SQL

Простая структура сотрудников

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 

Я попытался сделать заявление о делах таким образом:

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

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

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

 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 Expressions, см. В этой статье .

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

Вы можете сделать это с помощью 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.
  • У вашего метода хранения статуса менеджера есть одна проблема, которая заключается в том, что вы не можете представлять менеджера без каких-либо сотрудников (вы получаете статус менеджера из существования отношений сотрудник-менеджер). Если вы хотите иметь возможность сохранять статус менеджера отдельно от отношений employee-manager, тогда CREATE TABLE Managers (Employee. . . PRIMARY KEY) . Это сделает код, необходимый для получения статуса менеджера, немного легче написать.