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)
Desde o Postgres 9.1 a chave primária cobre todas as colunas de uma tabela no
GROUP BY
cláusula. Em versões mais antigas, você teria que adicionar a.limit_call
para o GROUP BY
Lista. As notas de lançamento para 9.1:
Permitir nãoGROUP BY
colunas na lista de destino da consulta quando a chave primária é especificada noGROUP BY
cláusula
Leitura adicional:
- Por que não consigo excluir colunas dependentes de `GROUP BY` quando agrego por uma chave?
A condição que você tinha em
WHERE
A cláusula deve ser movida para o HAVING
cláusula uma vez que se refere ao resultado de uma função agregada (depois WHERE
foi aplicado). E você não pode consultar colunas de saída (alias de coluna) no HAVING
cláusula, onde você só pode referenciar colunas de entrada. Então você tem que repetir a expressão. O manual:
O nome de uma coluna de saída pode ser usado para se referir ao valor da coluna emORDER BY
eGROUP BY
cláusulas, mas não noWHERE
ouHAVING
cláusulas; lá você deve escrever a expressão em vez disso.
Inverti a ordem das tabelas no
FROM
cláusula e limpamos um pouco a sintaxe para torná-la menos confusa. USING
é apenas uma conveniência de notação aqui. Eu usei
LEFT JOIN
em vez de JOIN
, para que você não exclua licenças sem nenhum log. Apenas valores não nulos são contados por
count()
. Como você deseja contar entradas relacionadas na tabela "Log"
é mais seguro e um pouco mais barato usar count(b.license_id)
. Esta coluna é usada na junção, então não precisamos nos preocupar se a coluna pode ser nula ou não.count(*)
é ainda mais curto e um pouco mais rápido, ainda. Se você não se importar em obter uma contagem de 1
para 0
linhas na tabela à esquerda, use isso. Além:eu aconselharia não usar identificadores de maiúsculas e minúsculas no Postgres, se possível. Muito propenso a erros.