как изменить синтаксис этого sql-запроса на 92 ‘s explicit join systax

#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 .. как в оригинале. просто нужен другой синтаксис