Материал предоставлен http://it.rfet.ru

Удаление дубликатов и ключевое слово DISTINCT

Необязательное ключевое слово DISTINCT исключает дубликаты из итогового набора. Если ключевое слово ON отсутствует, из результатов запроса с ключевым словом DISTINCT исключаются записи с повторяющимися значениями целевых полей. Проверяются только поля, входящие в целевой список SELECT.

Предположим, таблица books содержит 15 записей, в каждой из которых присутствует поле author_id. Некоторые коды авторов многократно встречаются в таблице books. Включение в запрос ключевого слова DISTINCT (листинг 18) гарантирует, что итоговый набор будет содержать не более одной записи для каждого автора.

Листинг 18. Ключевое слово DISTINCT.

booktown=# SELECT DISTINCT author_id 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) author_id, title  FROM books;

author_id | title
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)

Первый запрос в листинге 18 возвращает только 13 записей из таблицы books, хотя таблица содержит 15 записей. Два автора, написавшие по две книги, вошли в итоговый набор лишь в одном экземпляре.

Во втором запросе использована другая форма DISTINCT с явным перечислением полей (или выражений), проверяемых на наличие дубликатов. В этом случае запрос также возвращает 13 записей, поскольку секция ON указывает, что дубликаты проверяются по значению поля author_id. Без секции ON запрос вернул бы все 15 записей, поскольку по умолчанию PostgreSQL проверяет полное совпадение всех полей.

В общем случае PostgreSQL выбирает записи, исключаемые из итогового набора при наличии секции ON, по своему усмотрению. Если в запрос вместе с DISTINCT входит секция ORDER BY, вы можете самостоятельно задать порядок выборки полей так, чтобы нужные записи оказались в начале.

Если вместо исключения всех дубликатов достаточно сгруппировать записи с повторяющимися значениями некоторого критерия, воспользуйтесь секцией GROUP BY, описанной далее.

Выбор источников в секции FROMУточнение запросов