sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL Donde cuenta la condición

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.