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