Почему подзапрос SQL в предложении SELECT вычисляется несколько раз? - PullRequest
0 голосов
/ 28 февраля 2020
SELECT 
    P.Name, 
    (SELECT AVG(P1.Salary)
     FROM Payroll AS P1
     WHERE P.Job = P1.Job)
FROM 
    Payroll AS P

Запрос состоит в том, чтобы вычислить среднюю зарплату для работы каждого человека. Почему подзапрос на самом деле возвращает несколько кортежей вместо одного числа (средней зарплаты)?

Ответы [ 4 ]

0 голосов
/ 28 февраля 2020

Я думаю, что вы хотите сделать:

SELECT P.Name, P.Job, AVG(P.Salary)
FROM Payroll AS P
GROUP BY P.Name,P.Job
0 голосов
/ 28 февраля 2020

Если у вас есть несколько «заданий», доступных в платежной ведомости для каждого «имени», ваш запрос будет возвращать несколько строк для каждого «имени». Если я думаю правильно, вам нужно применить GROUP BY, как показано ниже, для достижения требуемого результата.

SELECT P.Name, (SELECT AVG(P1.Salary)
            FROM Payroll AS P1
            WHERE P.Job = P1.Job)
FROM Payroll AS P
GROUP BY P.Name,P.Job
0 голосов
/ 28 февраля 2020

Потому что предложение SELECT или WHERE работает построчно.

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

В основном запрос просматривает работу каждого сотрудника и определяет среднюю зарплату, предлагаемую для этой работы , и присваивает ее каждому сотрудника.

0 голосов
/ 28 февраля 2020

ЭТО нормально,

Используя это в этом подзапросе, вы говорите, что для каждого P.Job вычислите среднюю зарплату. Вы можете попробовать это так:

SELECT P.Name, p1.AvgSalaries
FROM Payroll AS P
inner join
 (SELECT P1.Job, AVG(P1.Salary) as AvgSalaries
  FROM Payroll AS P1 group by P1.Job
                ) p1 
on P.Job = P1.Job
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...