Najłatwiejsze do napisania zapytanie dotyczy MySQL (bez ścisłych ustawień ANSI). Wykorzystuje niestandardową konstrukcję:
SELECT key, value
FROM tableX
GROUP BY key ;
W najnowszej wersji (5.7 i 8.0+), w której rygorystyczne ustawienia ONLY_FULL_GROUP_BYsą domyślne, możesz użyć ANY_VALUE()funkcji dodanej w 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
W przypadku innych DBMS, które mają funkcje okien (takie jak Postgres, SQL-Server, Oracle, DB2), możesz ich używać w ten sposób. Zaletą jest to, że możesz również wybrać inne kolumny w wyniku (oprócz keyi 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 ;
Dla starszych wersji powyższego i dla dowolnego innego DBMS, ogólny sposób, który działa prawie wszędzie. Wadą jest to, że nie można wybrać innych kolumn przy takim podejściu. Innym jest to, że funkcje agregujące, takie jak MIN()i MAX()nie działają z niektórymi typami danych w niektórych DBMS (takich jak bit, tekst, obiekty BLOB):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL ma specjalnego niestandardowego DISTINCT ONoperatora, z którego można także korzystać. Opcjonalne ORDER BYjest wybranie wiersza z każdej grupy:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;