sql - SQL 的 DISTINCT 子句如何工作?

标签 sql sql-server-2008 join distinct

我正在寻找有关 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 过滤掉返回字段的重复值。

一个真正简单的看待它的方法是:

  • 它根据您的 FROMWHERE 子句构建总体结果集(包括重复项)
  • 它根据您要返回的字段对结果集进行排序
  • 它会删除这些字段中的所有重复值

它在语义上相当于 GROUP BY,其中所有返回的字段都在 GROUP BY 子句中。

关于sql - SQL 的 DISTINCT 子句如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8992804/

相关文章:

php - mysql 命令未使用 php 执行

mysql - 简单 SQL 连接的问题

join - ASP 经典 - 我如何连接字符串数组/连接/内爆不起作用

SQLite 创建上传和管理在线数据库

sql - 查询以将相同的 ID 分配给插入的行,如果它已存在于表中

sql-server - 在选择查询中向 xml 列添加节点

sql-server - 您能解释一下以下代码中 sys.sp_addextendedproperty 的使用吗?

sql - 尝试正确插入数据

postgresql - 将 JOIN 结果传递给记录并删除重复项

mysql - 选择 10 行与其他表中的所有行连接