PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL Onde condição de contagem

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ão GROUP BY colunas na lista de destino da consulta quando a chave primária é especificada no GROUP 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 em ORDER BY e GROUP BY cláusulas, mas não no WHERE ou HAVING 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.