La query più semplice da scrivere è per MySQL (con impostazioni ANSI non rigorose). Utilizza la costruzione non standard:
SELECT key, value
FROM tableX
GROUP BY key ;
Nella versione recente (5.7 e 8.0+) in cui le impostazioni rigide e ONLY_FULL_GROUP_BY
sono quelle predefinite, è possibile utilizzare la ANY_VALUE()
funzione, aggiunta in 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
Per altri DBMS, che hanno funzioni di finestra (come Postgres, SQL-Server, Oracle, DB2), è possibile utilizzarli in questo modo. Il vantaggio è che puoi selezionare anche altre colonne nel risultato (oltre a key
e value
):
SELECT key, value
FROM tableX
( SELECT key, value,
ROW_NUMBER() OVER (PARTITION BY key
ORDER BY whatever) --- ORDER BY NULL
AS rn --- for example
FROM tableX
) tmp
WHERE rn = 1 ;
Per le versioni precedenti di quanto sopra e per qualsiasi altro DBMS, un modo generale che funziona quasi ovunque. Uno svantaggio è che non è possibile selezionare altre colonne con questo approccio. Un altro è che funzioni aggregate come MIN()
e MAX()
non funzionano con alcuni tipi di dati in alcuni DBMS (come bit, testo, BLOB):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL ha un DISTINCT ON
operatore speciale non standard che può anche essere usato. L'opzionale ORDER BY
è per selezionare quale riga di ogni gruppo dovrebbe essere selezionata:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;