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 BYcolunas na lista de destino da consulta quando a chave primária é especificada noGROUP BYclá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 BYeGROUP BYcláusulas, mas não noWHEREouHAVINGclá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.