La requête la plus simple à écrire concerne MySQL (avec des paramètres ANSI non stricts). Il utilise la construction non standard:
SELECT key, value
FROM tableX
GROUP BY key ;
Dans la version récente (5.7 et 8.0+) où les paramètres stricts et ONLY_FULL_GROUP_BY
par défaut, vous pouvez utiliser la ANY_VALUE()
fonction, ajoutée en 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
Pour les autres SGBD, qui ont des fonctions de fenêtre (comme Postgres, SQL-Server, Oracle, DB2), vous pouvez les utiliser comme ceci. L'avantage est que vous pouvez également sélectionner d'autres colonnes dans le résultat (en plus de key
et 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 ;
Pour les anciennes versions de ce qui précède et pour tout autre SGBD, une manière générale qui fonctionne presque partout. Un inconvénient est que vous ne pouvez pas sélectionner d'autres colonnes avec cette approche. Un autre est que les fonctions d'agrégation aiment MIN()
et MAX()
ne fonctionnent pas avec certains types de données dans certains SGBD (comme bit, texte, blobs):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL dispose d'un DISTINCT ON
opérateur spécial non standard qui peut également être utilisé. L'option facultative ORDER BY
consiste à sélectionner la ligne de chaque groupe à sélectionner:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;