Ссылка на динамические столбцы в запросе postgres? - PullRequest
16 голосов
/ 20 января 2010

Допустим, у меня есть что-то вроде этого:

select sum(points) as total_points
from sometable
where total_points > 25
group by username

Я не могу сослаться на total_points в предложении where, потому что я получаю следующую ошибку: ERROR: column "total_points" does not exist. В этом случае у меня не возникнет проблем с переписыванием sum(points) в предложении where, но я бы хотел сделать то, что у меня есть выше.

  • Есть ли способ сохранить результат в переменной без с помощью хранимой процедуры?
  • Если я делаю переписать sum(points) в предложении where, достаточно ли postgres умно, чтобы не пересчитать его?

Ответы [ 3 ]

20 голосов
/ 20 января 2010
SELECT  SUM(points) AS total_points
FROM    sometable
GROUP BY
        username
HAVING  SUM(points) > 25

PostgreSQL не рассчитает сумму дважды.

10 голосов
/ 20 января 2010

Я считаю, что PostgreSQL похож на другие бренды SQL, где вам нужно сделать:

SELECT t.* 
FROM (
    SELECT SUM(points) AS total_points
    FROM sometable
    GROUP BY username
) t
WHERE total_points > 25

РЕДАКТИРОВАТЬ: Забыл псевдоним под псевдонимом.

8 голосов
/ 20 января 2010

У вас ошибка в заявлении:

select sum(points) as total_points
from sometable
where total_points > 25 -- <- error here
group by username

Вы не можете ограничить строки total_points, потому что sometable не имеет этого столбца. Вам нужно ограничить результирующие строки goupped total_points, вычисленными для каждой группы, так:

select sum(points) as total_points
from sometable
group by username
having sum(points) > 25

Если вы замените total_point в вашем примере, тогда вы просто проверяете, если сумма, вычисленная по всем строкам, больше 25, а затем возвращаете все строки, сгруппированные по имени пользователя.

Изменить:
Всегда помните порядок:

  1. это FROM с JOIN для получения таблиц
  2. равно WHERE для предельных строк из таблиц
  3. is SELECT для предельных столбцов
  4. равно GROUP BY для групповых строк в связанных группах
  5. равно HAVING для предела результирующих групп
  6. равно ORDER BY для результатов заказа
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...