Ответ 1
SELECT a.license_id, a.limit_call
, count(b.license_id) AS overall_count
FROM "License" a
LEFT JOIN "Log" b USING (license_id)
WHERE a.license_id = 7
GROUP BY a.license_id -- , a.limit_call -- add in old versions
HAVING a.limit_call > count(b.license_id)
Основные моменты
-
В версиях до PostgreSQL 9.1 вы должны добавить
limit_call
в предложениеGROUP BY
. Начиная с версии 9.1 достаточно иметь первичный ключ в предложенииGROUP BY
. Примечания к выпуску для 9.1:Разрешить столбцы
GROUP BY
non- в списке целей запроса, когда первичный ключ указан в предложенииGROUP BY
-
Условие
WHERE
должно перейти к предложениюHAVING
, поскольку оно относится к результату агрегатной функции. И вы не можете ссылаться на выходные столбцы (псевдонимы столбцов) в предложенииHAVING
, где вы можете ссылаться только на входные столбцы. Поэтому вы должны повторить выражение. По документации:Имя выходного столбца может использоваться для ссылки на значение столбца в предложениях
ORDER BY
иGROUP BY
, но не вWHERE
илиHAVING
; там вы должны выписать выражение вместо этого. -
Я изменил порядок таблиц в предложении
FROM
и немного очистил синтаксис, чтобы сделать его менее запутанным.USING
- это просто примечательное удобство. -
Я использовал
LEFT JOIN
вместоJOIN
, поэтому вы не исключаете лицензии без каких-либо журналов. -
Я бы посоветовал не использовать смешанные идентификаторы случая в Postgres, если это возможно. Очень склонна к ошибкам.
-
Только значения non- нулевые значения подсчитываются
count()
. Поскольку вы хотите подсчитать связанные записи в таблице"Log"
это безопаснее и немного дешевле использоватьcount(b.license_id)
. Этот столбец используется в соединении, поэтому нам не нужно беспокоиться о том, является ли столбец нулевым или нет.count(*)
еще короче и немного быстрее. Если вы не возражаете, чтобы получить счет1
для0
строк в левой таблице, используйте это.