Usa crosstab()
dal modulo tablefunc.
SELECT * FROM crosstab(
$$SELECT user_id, user_name, rn, email_address
FROM (
SELECT u.user_id, u.user_name, e.email_address
, row_number() OVER (PARTITION BY u.user_id
ORDER BY e.creation_date DESC NULLS LAST) AS rn
FROM usr u
LEFT JOIN email_tbl e USING (user_id)
) sub
WHERE rn < 4
ORDER BY user_id
$$
, 'VALUES (1),(2),(3)'
) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);
Ho usato le virgolette in dollari per il primo parametro, che non ha un significato speciale. È semplicemente conveniente evitare le virgolette singole nella stringa di query, che è un caso comune:
- Inserisci testo con virgolette singole in PostgreSQL
Spiegazione dettagliata e istruzioni:
- Query a campi incrociati PostgreSQL
E in particolare, per le "colonne extra":
- Pivota su più colonne utilizzando Tablefunc
Le difficoltà speciali ecco:
-
La mancanza di nomi di chiavi.
--> Sostituiamo conrow_number()
in una sottoquery. -
Il numero variabile di e-mail.
--> Ci limitiamo a un massimo. di tre nelSELECT
esterno
e usacrosstab()
con due parametri, fornendo un elenco di possibili chiavi.
Presta attenzione a NULLS LAST
nel ORDER BY
.