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 Postgres 9.1, la clave principal cubre todas las columnas de una tabla en el GROUP BY
cláusula. En versiones anteriores, tendría que agregar a.limit_call
al GROUP BY
lista. Las notas de la versión 9.1:
Permitir no GROUP BY
columnas en la lista de objetivos de consulta cuando la clave principal se especifica en GROUP BY
cláusula
Lectura adicional:
- ¿Por qué no puedo excluir columnas dependientes de `GROUP BY` cuando agrego por clave?
La condición que tenía en WHERE
la cláusula tiene que moverse a HAVING
ya que se refiere al resultado de una función agregada (después WHERE
ha sido aplicado). Y no puede hacer referencia a columnas de salida (alias de columna) en HAVING
cláusula, donde solo puede hacer referencia a columnas de entrada. Así que tienes que repetir la expresión. El manual:
El nombre de una columna de salida se puede usar para hacer referencia al valor de la columna en ORDER BY
y GROUP BY
cláusulas, pero no en el WHERE
o HAVING
cláusulas; allí debe escribir la expresión en su lugar.
Invertí el orden de las tablas en FROM
cláusula y limpió un poco la sintaxis para que sea menos confusa. USING
es solo una conveniencia notacional aquí.
Usé LEFT JOIN
en lugar de JOIN
, por lo que no excluye licencias sin ningún registro.
Solo los valores no nulos son contados por count()
. Dado que desea contar entradas relacionadas en la tabla "Log"
es más seguro y un poco más barato usar count(b.license_id)
. Esta columna se usa en la unión, por lo que no tenemos que preocuparnos de si la columna puede ser nula o no.count(*)
es aún más corto y un poco más rápido, todavía. Si no le importa obtener un recuento de 1
para 0
filas en la tabla de la izquierda, use eso.
Aparte:aconsejaría no usar identificadores de mayúsculas y minúsculas en Postgres si es posible. Muy propenso a errores.