Оператор SELECT DISTINCT
Хотя одной из целей применения реляционной модели базы данных является устранение повторяющихся данных, большинство баз данных неизбежно будут содержать одинаковые значения в нескольких строках. Например, таблица, содержащая информацию об адресах клиентов, будет, вероятно, включать одни и те же значения страны и штата для многих строк. Это не создает повторы строк и вполне допустимо, поскольку каждое значение штата является атрибутом отдельного клиента. Аналогично, таблица на стороне многих в отношении один-ко-многим может иметь любое заданное значение внешнего ключа, повторяющееся многократно. Это не только не является неправильным, но и необходимо для реляционной целостности базы данных.
Однако это повторение может дать двусмысленные результаты после выполнения запроса. Для упомянутой таблицы клиентов Customer, содержащей, допустим, 10000 строк, из которых 90 процентов относятся к клиентам из Калифорнии, следующий запрос возвратит значение CA (штат Калифорния) 9000 раз – результат, который едва ли можно назвать полезным.
SELECT State FROM Customer
Использование ключевого слова DISTINCT в подобных ситуациях является спасением. Будучи помещенным непосредственно после SELECT, ключевое слово DISTINCT инструктирует SQL Server избегать дублирующихся строк в результирующем множестве. При этом следующий запрос возвратит каждое значение State для штата только один раз, что вам и нужно.
SELECT DISTINCT State FROM Customer
Совет. Ключевое слово DISTINCT имеет антипод ALL, который инструктирует SQL Server возвращать все строки, как уникальные, так или нет. Поскольку этот режим действует для оператора SELECT, слово ALL обычно не используется, но вы можете его включить, если при этом синтаксис запроса становится более понятным и очевидным.