2016-04-23 4 views
0

У меня есть проблема с запросом, который работает на следующих talble:SQL Проблема с моим запросом

+---------------------------+ 
| ID NAME SALARY DEPARTMENT | 
+---------------------------+ 
| 1 John 100 Accounting  | 
| 2 Mary 200 IT    | 
+---------------------------+ 

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

Для каждого работодателя найдите среднюю зарплату тех сотрудников, чья заработная плата составляет либо на 100, либо на 100 меньше зарплаты данного работника, и они работают в одном отделе.

До сих пор у меня есть это:

SELECT E1.ID, AVG(E2.SALARY) FROM E1 EMP, E2 EMP 
WHERE ABS(E1.SALARY-E2.SALARY)<= 100 AND E1.DEPARTMENT = E2.DEPARTMENT 
GROUP BY E1.NAME 

Правильно ли это?

ответ

2

Вы бы лучше использовать явный синтаксис объединения:

SELECT E1.ID, AVG(E2.SALARY) 
FROM EMP E1 
JOIN EMP E2 
    ON E1.ID <> E2.ID AND 
     E1.DEPARTMENT = E2.DEPARTMENT AND 
     ABS(E1.SALARY - E2.SALARY) <= 100 
GROUP BY E1.ID 

Predicate E1.ID <> E2.ID необходимо в случае, если вы не хотите включать зарплату одного и того же работника в расчете средних величин.

+0

Есть ли разница в производительности между этими двумя операциями? – uksz

+0

Btw, спасибо, что указал на мою ошибку в том, что касается зарплаты одного и того же сотрудника! – uksz

+1

@uksz Да, потому что ваш запрос сначала выводит * декартово произведение * таблицы сотрудников для себя и * затем * применяет условия фильтрации. –

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