【发布时间】:2012-02-18 01:15:08
【问题描述】:
我正在寻找关于 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)并区分结果?
【问题讨论】:
-
你应该检查你的 SQL 引擎如何决定处理你的语法的解释计划。
标签: sql sql-server-2008 join distinct