Как работает предложение DISTINCT в SQL?

Я ищу ответ о том, как предложение 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) и различать результаты?

8
задан tshepang 27 September 2013 в 03:20
поделиться