我正在寻找关于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)并区分结果?
答案 0 :(得分:18)
DISTINCT
过滤掉返回的字段的重复值。
真正简化的方法是:
FROM
和WHERE
条款它在语义上等同于GROUP BY
,其中所有返回的字段都在GROUP BY
子句中。
答案 1 :(得分:3)
DISTINCT
只需在执行所有其他查询操作后对结果记录集进行重复数据删除。 This article有更详细的信息。
答案 2 :(得分:0)
首先选择所有“可用记录”,然后在所有“可用记录”中“删除重复记录”并打印。