#sql #sql-server #postgresql #self-join
#sql #sql-сервер #postgresql #самосоединение
Вопрос:
У меня есть таблица employee, как показано ниже
Мне нужно выбрать employee_id, manager_id, результат. результат должен иметь значение true или false, зависит от приведенных ниже условий.
- Если сотрудник является менеджером для кого-то, тогда true
- Если у сотрудника есть менеджер, тогда true
Я придумал запрос, но мне нужно знать, есть ли какой-либо другой лучший способ сделать это. Это мой запрос
with manager as
(
select distinct manager_id from employee where manager_id is not null
)
select
e.employee_id, e.manager_id , m.manager_id,
case when e.manager_id is not null then true
when m.manager_id is not null then true
else false
end as Result
from employee e left join manager m on e.employee_id = m.manager_id
и результат должен выглядеть так
Ответ №1:
Может быть, что-то вроде этого:
select
e.employee_id,
e.manager_id,
(
e.manager_id is not null
or
exists(select 1 from employee m where m.manager_id=e.employee_id)
) as result
from employee e;
Комментарии:
1. Пожалуйста, обратите внимание, что это выиграло бы от index on
employee(manager_id)
.2. по сравнению с моим запросом, будет ли это работать эффективно? (быстро)? как?
3. @Kavi это зависит от объема данных. Вы можете использовать
SET STATISTICS IO ON, TIME ON
для определения показателя производительности.4. @Kavi . . . Это быстрее — это действительно ни от чего не зависит. Никаких дополнительных накладных расходов на удаление дубликатов не требуется.
select distinct
требует дополнительной обработки.5. спасибо за ваши комментарии. Мне нужна еще одна помощь, есть ли какая-либо ссылка для создания более быстрого запроса. потому что каждый раз мне удавалось найти решение, но мой запрос не выполняется быстрее. каковы возможные способы построения эффективного запроса?