Удаление дубликатов и ключевое слово DISTINCT
Необязательное ключевое слово DISTINCT исключает дубликаты из итогового набора. Если ключевое слово ON отсутствует, из результатов запроса с ключевым словом DISTINCT исключаются записи с повторяющимися значениями целевых полей. Проверяются только поля, входящие в целевой список SELECT.
Предположим, таблица books содержит 15 записей, в каждой из которых присутствует поле authorjd. Некоторые коды авторов многократно встречаются в таблице books. Включение в запрос ключевого слова DISTINCT (листинг 4.31) гарантирует, что итоговый набор будет содержать не более одной записи для каждого автора.
Листинг 4.31. Ключевое слово DISTINCT.
booktown=# SELECT DISTINCT author_id booktown-# FROM books; author_id 16 115 1212 1644 1809 1866 2001 2031 4156 7805 7806 15990 25041 (13 rows) booktown=# SELECT DISTINCT ON (author_id) booktown-# author_id .title booktown-# FROM books; author_id | ntitle 16 | Little Women 115 | The Tell-Tale Heart 1212 | Practical PostgreSQL 1644 | Dynamic Anatomy 1809 | The Cat in the Hat 1866 | Dune 2001 | 2001: A Space Odyssey 2031 | Goodnight Moon 4156 | The Shining 7805 | Programming Python 7806 | Perl Cookbook 15990 |Franklin in the Dark 25041 | The Velveteen Rabbit (13 rows)
Первый запрос в листинге 4.31 возвращает только 13 записей из таблицы books, хотя таблица содержит 15 записей. Два автора, написавшие по две книги, вошли в итоговый набор лишь в одном экземпляре.
Во втором запросе использована другая форма DISTINCT с явным перечислением полей (или выражений), проверяемых на наличие дубликатов. В этом случае запрос также возвращает 13 записей, поскольку секция ON указывает, что дубликаты проверяются по значению поля author_i d. Без секции ON запрос верн)и бы все 15 записей, поскольку по умолчанию PostgreSQL проверяет полное совпадение всех полей.
В общем случае PostgreSQL выбирает записи, исключаемые из итогового набора при наличии секции ON, по своему усмотрению. Если в запрос вместе с DISTINCT входит секция ORDER BY, вы можете самостоятельно задать порядок выборки полей так, чтобы нужные записи оказались в начале. Сортировка записей рассматривается в подразделе "Сортировка записей".
Если вместо исключения всех дубликатов достаточно сгруппировать записи с повторяющимися значениями некоторого критерия, воспользуйтесь секцией GROUP BY, описанной в подразделе "Группировка записей".