我正在寻找关于在包含多个表的查询中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)并区分结果?
DISTINCT过滤掉您 返回的 字段的重复值。
DISTINCT
一种真正简化的查看方式是:
FROM
WHERE
它在语义上等效于GROUP BY所有返回的字段都在GROUP BY子句中的。
GROUP BY