Как работает предложение SQL DISTINCT? - PullRequest
8 голосов
/ 24 января 2012

Я ищу ответ о том, как работает предложение DISTINCT в SQL (SQL Server 2008, если это имеет значение) для запроса с несколькими объединенными таблицами?

Я имею в виду, как механизм SQL обрабатывает запрос с предложением DISTINCT?

Причина, по которой я спрашиваю, состоит в том, что мой гораздо более опытный коллега сказал мне, что SQL применяет DISTINCT к каждому полю каждой таблицы.Это кажется маловероятным для меня, но я хочу убедиться ...

Например, с двумя таблицами:

CREATE TABLE users
(
u_id INT PRIMARY KEY,
u_name VARCHAR(30),
u_password VARCHAR(30)
)

CREATE TABLE roles
(
r_id INT PRIMARY KEY,
r_name VARCHAR(30)
)

CREATE TABLE users_l_roles
(
u_id INT FOREIGN KEY REFERENCES users(u_id) ,
r_id INT FOREIGN KEY REFERENCES roles(r_id) 
)

И затем с таким запросом:

SELECT          u_name
FROM            users 
INNER JOIN      users_l_roles ON users.u_id = users_l_roles.u_id
INNER JOIN      roles ON users_l_roles.r_id = roles.r_id 

Если предположить, что был пользователь с двумя ролями, то вышеупомянутый запрос вернет две записи с одним и тем же именем пользователя.

Но этот запрос с отличным:

SELECT DISTINCT u_name
FROM            users 
INNER JOIN      users_l_roles ON users.u_id = users_l_roles.u_id
INNER JOIN      roles ON users_l_roles.r_id = roles.r_id 

вернет только одно имя пользователя.

Вопрос в том, будет ли SQL сравнивать все поля из всех соединенных таблиц (u_id, u_name, u_password, r_id, r_name) или сравнивать только именованные поля в запросе (u_name) и различать результаты.

Ответы [ 3 ]

19 голосов
/ 24 января 2012

DISTINCT отфильтровывает повторяющиеся значения ваших возвращенных полей.

Действительно упрощенный взгляд на это:

  • Он строит ваш общий набор результатов (включая дубликаты) на основе ваших FROM и WHERE предложений
  • Сортирует этот набор результатов по полям, которые вы хотите вернуть
  • Удаляет все повторяющиеся значения в этих полях.

Это семантически эквивалентно GROUP BY, где все возвращенные поля находятся в предложении GROUP BY.

3 голосов
/ 24 января 2012

DISTINCT просто дедуплицирует результирующий набор записей после выполнения всех других операций запроса. Эта статья содержит более подробную информацию.

0 голосов
/ 01 сентября 2013

Сначала выбираются все «доступные записи», а затем он «удаляет дубликаты записей» во всех «доступных записях» и печатает.

...