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_BY
są 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 key
i 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 ON
operatora, z którego można także korzystać. Opcjonalne ORDER BY
jest wybranie wiersza z każdej grupy:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;