Gunnar Wolf escribió:

>      SELECT * FROM (
>           SELECT email, array_agg(show_keyid(keyid)) AS keys,
>                  cardinality(array_agg(show_keyid(keyid))) as numkeys
>           FROM pubkey_metadata GROUP BY email) AS set
>      WHERE '673a03e4c1db921f' = ANY(keys);
> 
> Comparando sus query plans y tiempos de ejecución me parecen casi
> sinónimos. Pero, sí, la versión con ANY resulta un poco más legible y
> clara para el humano, que no es poca cosa :)
> 
> (¿que por qué usé un subquery para algo tan trivial como esto? Porque
> si no, el ANY(keys) se quejaba de que keys no existía, y no puedo
> incluir una función en el WHERE).

Ah, claro.  Creo que puedes escribirlo más elegante así:

  SELECT email,
         array_agg(show_keyid(keyid)) AS keys,
         cardinality(array_agg(show_keyid(keyid))) as numkeys
    FROM pubkey_metadata
GROUP BY email
  HAVING '673a03e4c1db921f' = ANY(array_agg(show_keyid(keyid)));

WHERE aplica a los registros de entrada a la agrupación, antes de ser
agrupados (por eso no puedes poner la función ahí); HAVING aplica
después de la agrupación.

-- 
Álvaro Herrera                https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a