SQL 的 DISTINCT 子句如何工作?

2023-11-21

我正在寻找有关 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过滤掉你的重复值returned fields.

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

  • 它根据您的结果构建总体结果集(包括重复项)FROM and WHERE clauses
  • 它根据您要返回的字段对该结果集进行排序
  • 它删除这些字段中的任何重复值

它在语义上等价于GROUP BY所有返回的字段都在GROUP BY clause.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 的 DISTINCT 子句如何工作? 的相关文章

  • 合并并添加两个表中的值

    是否可以制作一个在两个表中添加值的查询 例如 假设您有两张表 id value a 1 c 2 d 3 f 4 g 5 and id value a 1 b 2 c 3 d 4 e 5 然后 当您 添加 两个表时 您将获得 id 匹配的结果
  • Oracle SQL-根据记录的日期与历史记录标记记录

    这是我在论坛上的第一篇文章 通常我能够找到我需要的东西 但说实话 我不太确定如何针对该问题提出正确的问题 因此 如果论坛上已经有答案而我错过了 请接受我的歉意 我通过 Benthic Software 在 Oracle 数据库中运行以下代码
  • Entity Framework 6 多对多想要插入重复行

    不应该这么难 我准备放弃EF了 我的模型有周刊版本 每个版本可以有许多分类广告 每个分类可以出现在一个或多个版本中 我的模型 public class Classifieds Key DatabaseGenerated DatabaseGe
  • Allen Browne 的 ConcatRelated() 错误 3061:参数太少

    我正在尝试创建给定仓库的产品列表 Allen Browne 的 ConcatRelated 函数似乎是在链接变量相同时创建列表的经过验证的正确方法 但我无法让它工作 我已将我的信息分解为单个查询 qry Products SELECT qr
  • SQL 分隔符上的逗号分隔列

    这是一个 split 函数 它可以应用为dbo Split sf we fs we 当我将字符串更改为列名时 它不起作用 例如dbo Split table columnName Select from dbo Split email pr
  • 如何授予 SQL Server 代理访问权限以便能够写入/修改系统文件?

    我的工作有一个存储过程 运行 BCP 来查询一些数据 如果我单独运行 QUERYOUT 命令 它就会起作用 但是 如果我尝试在作业中运行它 它会创建文件但 挂起 并且数据永远不会放入文件中 这会永远挂起 所以我通常终止 BCP exe 我的
  • FireDac 添加下划线 1 以区分具有相同名称的 2 个列名

    我有一个连接 2 个表的选择 因此这些表中存在具有相似名称的列 因此现在在检索结果时 FireDac 将下划线 1 添加到第二个列名称以区分这两个表 Select from Table1 inner join Table2 on Table
  • MySQL 5:我的 GROUP BY 字段的顺序重要吗?

    Peeps 我的 MySQL 查询中有一些聚合 计算字段 我的 GROUP BY 子句是动态生成的 具体取决于用户在 Web 表单中选择的选项 很好奇 GROUP BY 子句中列出的字段顺序是否会对计算产生任何影响 例如 SUM AVERA
  • 单个查询删除并显示重复记录

    采访中提出的问题之一是 一张表有100条记录 其中 50 个 是重复的 是否可以用单个 查询删除重复记录 从表中以及选择和 显示剩余 50 条记录 这可以在单个 SQL 查询中实现吗 Thanks SNA 对于 SQL Server 你会使
  • 如何将表移动到 T-SQL 中的架构中

    我想使用 T SQL 将表移动到特定架构中 我正在使用 SQL Server 2008 ALTER SCHEMA TargetSchema TRANSFER SourceSchema TableName 如果你想搬家all表到一个新的模式
  • 使用显式创建表语句与 select into 创建表

    使用显式创建表语句和加载数据与选择数据之间是否存在性能差异 此示例仅显示 2 列 但问题是针对使用非常大的表 下面的示例也使用临时表 尽管我也想知道使用常规表的效果 我认为无论表格类型如何 它们都是相同的 临时表场景 Explicitly
  • PostgreSQL 窗口函数:row_number() over(按 col2 分区 col 顺序)

    以下结果集源自具有一些连接和联合的 SQL 查询 SQL 查询已经对 Date 和 game 上的行进行了分组 我需要一列来描述按日期列分区的游戏的尝试次数 Username Game ID Date johndoe1 Game 1 100
  • PL/SQL 过程:如何返回 select 语句?

    我想创建一个存储过程 on ORACLE数据库服务器我的问题是 我不知道如何返回 select 语句 这是程序中应包含的逻辑 输入参数 过滤器1 int 过滤器2 字符串 with cte as select val1 val2 stdde
  • 火鸟删除速度很慢

    我正在做这个简单的交易 DELETE FROM ominve01 WHERE CVE OBS IN SELECT CVE OBS FROM minve01 M WHERE M FECHA DOCU lt 31 12 2010 OR FECH
  • 将自动递增值添加到只有一列的表中

    我需要创建一个基本上仅保留索引列表的表 因此 我创建了一个只有一个名为 id 的自动递增列的表 但是 我似乎无法隐式地将自动递增值添加到该表中 我知道通常当您在表中有这样一列 不仅仅是此列 时 您可以执行以下操作 插入表 col1 col2
  • 在 Oracle 中使用数据透视表的建议

    我需要一份报告 我应该使用数据透视表 报告将按类别分组 使用 case when 语句不好 因为有很多类别 您可以将 Northwind 数据库视为示例 所有类别将显示为列和报告将显示客户在类别中的偏好 我不知道另一个解决方案 并在互联网上
  • PostgreSQL WHERE 计数条件

    我在 PostgreSQL 中有以下查询 SELECT COUNT a log id AS overall count FROM Log as a License as b WHERE a license id 7 AND a licens
  • INTEGER 到 DATETIME 的转换与 VB6 不同

    我正在查看一些遗留的 VB6 代码 比我的时代早很多年 它对 SQL 2005 数据库运行查询 它提供了日期限制WHERE子句 其中日期作为整数值给出CLng VB6 中的日期 e g WHERE SomeDateField gt 4006
  • 如何在 Postgresql 中将 GIST 或 GIN 索引与 hstore 列一起使用?

    我正在使用 postgresql 9 3 的 hstore 我正在尝试对 hstore 列使用索引就像文档所述 http www postgresql org docs 9 3 static hstore html 我的问题是索引似乎没有被
  • 在 SQL Server 中获取一周的第一天

    我试图按周对记录进行分组 将聚合日期存储为一周的第一天 然而 我用于四舍五入日期的标准技术似乎无法在几周内正常工作 尽管它可以在天 月 年 季度和我应用的任何其他时间范围内正常工作 这是 SQL select start of week d

随机推荐

  • 有没有一种简单的方法可以在 Visual Studio 中编写 UTF-8 八位字节?

    我有一个问题 我需要在 C 源代码中的标准 char 类型上使用 UTF 8 编码的字符串 如下所示 char twochars xe6 x97 xa5 xd1 x88 通常 如果我想编写 UTF 8 字符 我需要使用如上所述的八位字节 V
  • 非规范化数据

    我使用以下 R 代码将数据标准化为最小值和最大值 normalize lt function x return x min x max x min x mydata lt as data frame lapply mydata normal
  • .NET 类及其源代码

    当我编写 C 或任何 NET 程序 时 我使用方法和类 我使用的大部分代码都是从 NET 类调用方法 是否可以 纯粹出于好奇 查看这些类的实际源代码 我知道 MSDN 有完整的类 它们的属性和方法的列表 但我想看看代码 是的 浏览 NET框
  • Django 按点赞数最高的顺序排序

    我正在尝试创建一个页面 人们可以在其中看到评分最高的文章 但存在一个问题 当我过滤另一用户也喜欢的文章的点赞数时 它会创建已投票文章的副本 我想要的是按照点赞数最高的顺序对博客的文章进行排序 模型 py class Article mode
  • 使用 Realm.io 存储货币值

    我开始在我正在编写的 Android 应用程序中使用 Realm io 在我的一个数据对象中 我需要存储货币值 以前 我在内部将该值存储为 BigDecimal 值 然后在移入和移出数据库时也将其转换为双精度值 我总是被告知 由于处理货币值
  • TCP套接字客户端通过nodejs上的代理

    我需要与 smtp 服务器建立 tcp 套接字连接 是否可以通过nodejs上的代理服务器连接 有可用的 npm 模块吗 我根本找不到任何东西 var net require net var HOST 127 0 0 1 var PORT
  • Python 3 中的 Concurrent.futures 与多重处理

    Python 3 2 推出并发期货 这似乎是旧线程的一些高级组合多重处理模块 与旧的多处理模块相比 将其用于 CPU 密集型任务有哪些优点和缺点 本文表明他们更容易合作 是这样吗 我不会打电话concurrent futures更 先进 这
  • iOS 8.1.3 - 企业分发 - 应用程序缺少应用程序标识符权利

    我在 iOS 8 1 3 上使用 Enterprise Distribution 时遇到很多问题 我设法修复了大部分出现此错误的安装 Ignore manifest download already have bundleID 有了这个答案
  • 使用 Travis 调用 GitHub API 构建 Tag

    我在 GitHub 存储库中创建了一个 TravisCI Hook 它在推送到存储库后自动运行构建 我想补充的是 如果构建成功 则会自动创建一个标签 我发现有一种方法可以使用 GitHub API 创建标签http developer gi
  • Eclipse 无法运行:\.metadata\.log 错误

    我正在做一个Android项目 重新启动计算机后 eclipse无法运行 它抛出 metadata log 文件错误 Go to metadata plugins org eclipse core resources你会找到 snap文件
  • 如何获取 SSL 证书以在 Firefox 上使用本地主机

    我正在努力让一个网站在本地 apache 网络服务器上运行 当我单击网站中的某些链接时遇到错误 Firefox 显示 无法连接 错误页面 并在 URL 前面附加 https 我首先认为这是浏览器配置问题 并尝试了此处建议的所有解决方案 Fi
  • 在 C# 中调用父表单中的方法并访问父表单中的 gui 元素的最佳实践

    我正在开发一个 win 表单应用程序 我发现自己经常需要访问父表单中的方法 例如来自另一个类的 Form1 无论是表单类还是只是一个类 我的 form 1 的构造函数中有一些初始值设定项 因此我无法创建 Form1 的实例 所以我无法访问
  • 为什么我可以省略调用链中后续的空条件运算符?

    考虑以下代码 IEnumerable
  • 获取jqGrid中所有行ID

    如何获取网格中每一行的 ID 甚至是跨页的 ID getDataIDs and getRowData只给出当前页面的 ID Thanks 仅当您有本地网格时才有可能 datatype local 或有loadonce true 在这种情况下
  • 受约束的 d3.js 强制显示

    我想用力布局做一些不寻常的事情 用于可视化图表 星座和所有这些看起来都很有趣 但对于时间序列数据来说 它并没有那么有用 我希望能够通过某个轴来约束布局 例如 通过根据节点在数据集中出现的时间来布局节点 同时仍然保留可视化的 弹性 使用 d3
  • 将 HTTP 基本身份验证标头添加到 Backbone.js 同步功能可防止模型在 Save() 上更新

    我正在开发一个 Web 应用程序 该应用程序由使用 Python 的 CherryPy 框架编写的 Restful API 提供支持 我开始使用 jQuery 和服务器端模板的组合来编写用户界面 但最终切换到 Backbone js 因为
  • 使用Razor视图引擎输出Json

    我有一个dictionary
  • 查询帮助 - where 子句中的字符串有 & 字符

    我正在运行这样的 SQL Oracle 语句 select from table where table id in 265 310 266 320 在运行 TOAD 时 它会考虑 作为一些变量占位符 它询问它的值 如果它是 1 2 个占位
  • 无法打开共享对象文件:没有这样的文件或目录;在 Eclipse 中运行或调试

    在 Ubuntu 上 我在 Eclipse 中有一个 C 应用程序 该应用程序编译良好 我可以从命令行运行该应用程序 但是当我尝试调试它或使用 Eclipse 运行它时 error Cannot open shared object fil
  • SQL 的 DISTINCT 子句如何工作?

    我正在寻找有关 DISTINCT 子句在 SQL SQL Server 2008 如果这有影响的话 中如何在连接多个表的查询上工作的答案 我的意思是 SQL 引擎如何处理带有 DISTINCT 子句的查询 我问这个问题的原因是 我经验丰富的