| From: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
|---|---|
| To: | Gunnar Wolf <gwolf(at)gwolf(dot)org> |
| Cc: | PostgreSQL Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>, Víctor Gonzalez Quiroga <masterquiroga(at)ciencias(dot)unam(dot)mx> |
| Subject: | Re: Encontrar una manera menos intensiva de hacer una consulta |
| Date: | 2017-03-14 20:20:51 |
| Message-ID: | 20170314202051.tmrd4ynmstpiikb2@alvherre.pgsql |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-es-ayuda |
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(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Jaime Casanova | 2017-03-15 16:43:56 | Re: repmgr y failover automático error |
| Previous Message | Gunnar Wolf | 2017-03-14 19:58:43 | Re: Encontrar una manera menos intensiva de hacer una consulta |