Эффективный способ обработки запроса ниже? в SQLServer или PostgreSQL (самосоединение)

#sql #sql-server #postgresql #self-join

#sql #sql-сервер #postgresql #самосоединение

Вопрос:

У меня есть таблица employee, как показано ниже

выберите * из employee

Мне нужно выбрать employee_id, manager_id, результат. результат должен иметь значение true или false, зависит от приведенных ниже условий.

  1. Если сотрудник является менеджером для кого-то, тогда true
  2. Если у сотрудника есть менеджер, тогда 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. спасибо за ваши комментарии. Мне нужна еще одна помощь, есть ли какая-либо ссылка для создания более быстрого запроса. потому что каждый раз мне удавалось найти решение, но мой запрос не выполняется быстрее. каковы возможные способы построения эффективного запроса?