#sql
#sql
Вопрос:
Как я могу переписать приведенный ниже запрос в явном синтаксисе соединения SQL ’92, используя только внутренние или внешние соединения
SELECT e.emp_id ,
( SELECT AVG(salary)
FROM #salary d
WHERE d.emp_id = e.emp_id )
FROM #emp e
Комментарии:
1. извините, забыл упомянуть, не могу использовать group by
2. Вы не можете получить среднее значение без группировки — если только вы не пытаетесь показать одинаковую среднюю зарплату для всех сотрудников.
3. но этот запрос работает нормально .. я просто хотел переписать, используя синтаксис 92. можно ли то же самое реализовать с помощью простых объединений?
4.
group by
был создан для подобных заданий. То, что вы «не можете использовать», не имеет смысла и делает это значительно менее похожим на реальный вопрос.5. Какая часть вашего запроса не является «синтаксисом 92»? Вы не используете «неявную нотацию соединения». Вы как бы выполняете не join, а коррелированный подзапрос, и это способ сделать это, если вы не хотите использовать
group by
.
Ответ №1:
Я даже не уверен, зачем вам нужен внешний выбор; Идентификатор сотрудника присутствует в обеих таблицах, вам вообще не нужно соединение:
SELECT salary.emp_id, AVG(salary.salary)
FROM salary
GROUP BY salary.emp_id
Ну, может быть, некоторым сотрудникам не платят зарплату, и вам просто нужно значение NULL ( AVG()
строго в вашей СУБД?)
SELECT e.emp_id, AVG(d.salary)
FROM employee e
LEFT OUTER JOIN salary d ON e.emp_id = d.emp_id
GROUP BY e.emp_id
Комментарии:
1. Почему вы уточняете столбцы в своем первом запросе?
2. привычка. также я должен ввести 15 символов.
3. пытаюсь добиться этого без использования group by, как в исходном запросе, но с синтаксисом 92. Возможно ли это?
4. Вы берете агрегат; происходит операция с окном, независимо от того, используете ли вы
GROUP BY
или подвыборку в списке выбора; почему вы думаете, что вам нужен подвыбор?5. необходимо реализовать group by без использования «group by»
Ответ №2:
Хорошая мысль отTokenMacGuy о том, что таблица #emp не нужна. Однако, предположим, что вы хотите запросить только те записи в #salary, которые также находятся в #emp. В этом случае вам нужно будет переместить ваше предложение WHERE в предложение ON объединения и добавить предложение GROUP BY:
SELECT e.emp_id, AVG(d.salary)
FROM #salary d
INNER JOIN #emp e ON d.emp_id = e.emp_id
GROUP BY e.emp_id
Комментарии:
1. мне нужен запрос без использования group by .. как в оригинале. просто нужен другой синтаксис