2015-07-29 2 views
-7

Мне интересно, что я делаю правильно.Является ли этот оператор SQL правильным?

select distinct 
    Departments.Department_No, Departments.Department_Name 
from 
    Departments 
join 
    Employees on Departments.Department_No = Employees.Department_No 
join 
    Jobs on Jobs.Job_ID = Employees.Job_ID 
where 
    Departments.Department_No not in (select distinct Department_No 
             from Employees 
             where Employees.Job_ID like '%SA_REP%'); 
+1

Какие СУБД вы используете? и что нужно в результате? –

+5

Вы пробовали его исполнить? –

+2

Получает ли он правильные результаты? Что вас особенно беспокоит? –

ответ

2
  • Вы хотите отобразить различные значения Department Number и Department Name
  • Вы присоединяетесь Employees таблицы с Department на Department Number
  • Вы присоединяетесь Jobs таблицу с Employees на Job ID
  • Вы фильтровать результат, за исключением тех, Department Numbers всейEmployee таблицы что есть Job ID соответствие шаблону %SA_REP%

На мой взгляд, вы не» t необходимо

  • соединение с Jobs стол
  • объединение с Employees столом
  • вы могли бы, возможно, увидеть, если один из предложений у остальных пользователей может принести улучшение производительности

SELECT DISTINCT departments.department_no, 
       departments.department_name 
FROM departments 
WHERE departments.department_no NOT IN (SELECT DISTINCT department_no 
             FROM employees 
             WHERE employees.job_id LIKE '%SA_REP%' 
             ); 
1

Вы можете перевести, где условия без "in". И вам не нужно получить дату от «Работы» - вы не используете его

Select distinct Departments.Department_No, Departments.Department_Name 
from Departments 
Join Employees on Departments.Department_No = Employees.Department_No 
where Employees.Job_ID not like '%SA_REP%'; 
2

Вы можете просто сделать это с помощью NOT EXISTS вместо использования NOT IN подзапроса:

SELECT DISTINCT 
    d.Department_No 
    ,d.Department_Name 
FROM Departments d 
JOIN Employees e ON d.Department_No = e.Department_No 
WHERE NOT EXISTS 
    (select 1 
    from Employees e1 
    where e1.Job_ID like '%SA_REP%' 
    AND e1.Department_No = e.Department_No); 
+1

Это изменяет семантику. Запрос в OP не будет возвращать отдел, если у него есть * любые * сотрудники с 'Job_ID like '% SA_REP%'' - это все равно вернет отдел, если только все * сотрудники не совпадут с этим условием. –

+0

@MartinSmith Я полагаю, вы правы. Я так не думал. Я обновил свое решение, чтобы вместо этого использовать 'NOT EXISTS'. – FutbolFan

Смежные вопросы