Самый простой запрос для записи - для MySQL (с не строгими настройками ANSI). Используется нестандартная конструкция:
SELECT key, value
FROM tableX
GROUP BY key ;
В последних версиях (5.7 и 8.0+), где строгие настройки и ONLY_FULL_GROUP_BY
являются настройками по умолчанию, вы можете использовать ANY_VALUE()
функцию, добавленную в 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
Для других СУБД, которые имеют оконные функции (например, Postgres, SQL-Server, Oracle, DB2), вы можете использовать их следующим образом. Преимущество в том, что вы можете выбрать и другие столбцы в результате (кроме key
и 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 ;
Для более старых версий выше и для любой другой СУБД, общий способ, который работает почти везде. Одним из недостатков является то, что вы не можете выбрать другие столбцы с этим подходом. Другое - агрегатные функции, такие как MIN()
и MAX()
не работающие с некоторыми типами данных в некоторых СУБД (например, бит, текст, большие двоичные объекты):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL имеет специальный нестандартный DISTINCT ON
оператор, который также можно использовать. Необязательный ORDER BY
для выбора строки из каждой группы:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;