【问题标题】:How SQL's DISTINCT clause works?SQL 的 DISTINCT 子句如何工作?
【发布时间】: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


【解决方案1】:

DISTINCT 过滤掉您返回的字段的重复值。

一个真正简化的查看方式是:

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

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

【讨论】:

【解决方案2】:

DISTINCT 在执行所有其他查询操作后简单地对结果记录集进行重复数据删除。 This article 有更多细节。

【讨论】:

    【解决方案3】:

    首先选择所有“可用记录”,然后在所有“可用记录”中“删除重复记录”并打印。

    【讨论】:

      猜你喜欢
      • 2017-04-12
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多