SQL 效率:WHERE IN 子查询与 JOIN then GROUP

2023-12-19

例如,我想获取应用了某些标签的所有项目的列表。我可以执行以下任一操作:

SELECT Item.ID, Item.Name
FROM Item
WHERE Item.ID IN (
    SELECT ItemTag.ItemID
    FROM ItemTag
    WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55)

Or

SELECT Item.ID, Item.Name
FROM Item
LEFT JOIN ItemTag ON ItemTag.ItemID = Item.ID
WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55
GROUP BY Item.ID, Item.Name

或者完全不同的东西。

一般来说(假设有一般规则),什么是更有效的方法?


SELECT Item.ID, Item.Name
FROM Item
WHERE Item.ID IN (
    SELECT ItemTag.ItemID
    FROM ItemTag
    WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55)

or

SELECT Item.ID, Item.Name
FROM Item
LEFT JOIN ItemTag ON ItemTag.ItemID = Item.ID
WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55
GROUP BY Item.ID

您的第二个查询将无法编译,因为它引用了Item.Name没有对其进行分组或聚合。

如果我们删除GROUP BY从查询中:

SELECT  Item.ID, Item.Name
FROM    Item
JOIN    ItemTag
ON      ItemTag.ItemID = Item.ID
WHERE   ItemTag.TagID = 57 OR ItemTag.TagID = 55

这些仍然是不同的查询,除非ItemTag.ItemId is a UNIQUE键并标记为这样。

SQL Server能够检测到IN条件为UNIQUE列,并且只会改变IN条件变为JOIN.

If ItemTag.ItemID is not UNIQUE,第一个查询将使用一种SEMI JOIN算法,在以下方面非常有效SQL Server.

您可以将第二个查询转换为JOIN:

SELECT  Item.ID, Item.Name
FROM    Item
JOIN    (
        SELECT DISTINCT ItemID
        FROMT  ItemTag
        WHERE  ItemTag.TagID = 57 OR ItemTag.TagID = 55
        ) tags
ON      tags.ItemID = Item.ID

但这比效率低一点IN or EXISTS.

有关更详细的性能比较,请参阅我的博客中的这篇文章:

  • IN vs. JOIN vs. EXISTS http://explainextended.com/2009/06/16/in-vs-join-vs-exists/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 效率:WHERE IN 子查询与 JOIN then GROUP 的相关文章

  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di
  • 如何对 SQL Server 中的数据库进行单元测试?

    有哪些方法呢 您可以使用哪些框架 好吧 我想你的意思是对访问数据库的代码进行单元测试 在这种情况下 有NDbUnit http www ndbunit org 它似乎是 NET 的 DbUnit 克隆 我从来没有使用过它 但是我使用过DbU
  • 并行何时会提高性能

    我试图理解何时使用parallel会提高性能 我用一个简单的代码对其进行了测试 该代码运行了超过 100 000 个项目List
  • 在 Java 中有效地对图像进行颜色循环

    我正在编写一个曼德尔布罗分形查看器 我想以智能的方式实现颜色循环 给定一个图像 我想修改它的 IndexColorModel 据我所知 没有办法修改 IndexColorModel 也没有办法为图像提供新的 IndexColorModel
  • 通过左连接实现精确分页

    我已经思考这个问题有一段时间了 我认为最好四处询问并听听其他人的想法 我正在构建一个在 Mysql 上存储位置的系统 每个位置都有一个类型 有些位置有多个地址 表格看起来像这样 location location id autoincrem
  • Pandas read_sql 读取时更改大量 ID

    我将 Oracle 数据库转移到 SQL Server 一切似乎都很顺利 各种 ID 列都是很大的数字 因此我不得不使用 Decimal 因为它们对于 BigInt 来说太大了 我现在尝试使用 pandas read sql 使用 pyod
  • MySQL 性能 DELETE 或 UPDATE?

    我有一个超过 10 7 行的 MyISAM 表 向其中添加数据时 我必须在最后更新 10 行 删除它们然后插入新行更快 还是更新这些行更快 应更新的数据不是索引的一部分 索引 数据碎片怎么样 UPDATE到目前为止要快得多 当你UPDATE
  • 为什么 SQL Server 不推荐使用 SET ANSI_PADDING OFF?

    根据 MSDN BOL 在线书籍 SET ANSI PADDING http msdn microsoft com en us library ms187403 aspx 在 Microsoft SQL Server 的未来版本中 ANSI
  • DBCC命令是存储过程还是函数?

    应该是什么DBCC命令被调用 DBCC 过程还是 DBCC 函数 这很令人困惑 因为DBCC PAGE可以在不加前缀的情况下执行EXEC语句很像存储过程 但EXEC DBCC PAGE 1 1 1 3 抛出错误 语法错误 消息 156 关键
  • 如何从时区名称获取时区偏移量

    我有一个时区名称 例如America Vancouver保存在 SQL Server 数据库中 我想从 SQL 中的时区名称获取 UTC 偏移量 例如America Vancouver has 08 00抵消 那么如何用 SQL 编写查询呢
  • django pyodbc 数据源名称未找到

    当尝试连接到我的数据库服务器和 Django 中的数据库时 我收到错误 django db utils InterfaceError IM002 IM002 Microsoft ODBC Driver Manager 未找到数据源名称且未指
  • Python(和 Java)中最快的数据打包

    Sometimes http www codinghorror com blog 2009 01 the sad tragedy of micro optimization theater html our host is wrong na
  • 预填充 UICollectionView 单元重用队列

    问题 我有一个应用程序 只有一个UICollectionView我第一次滚动它时很卡顿 我已将来源范围缩小到正在创建新单元格 2 的事实 使用initWithFrame 因为周围没有可以重复使用的细胞 初始滚动后 重用队列不为空 单元格可以
  • .net Framework 4.0 中地理 SQL Server 数据类型的 C# 等效项是什么?

    net web应用程序使用 net 4 0框架 我有一个存储过程 它接受 sql server 2008 R2 中的地理数据类型 我想将 C 代码中的数据插入 SQL Server 但我无法找到应在 C 中使用哪种与 SQL Server
  • T-SQL 中结果集的幂集(所有组合)

    我需要一个 t sql 代码来获取结果集的幂集 输入示例 ColumnName 1 2 3 Example Output one columns as nvarchar 1 2 3 1 2 1 3 2 3 1 2 3 输出集可能包含重复值
  • 删除或更改 ETL 中的记录

    我有一个表 我在上面构建了 ETL 服务 货物记录 到达 离开 进入表格 我已经这样做了 我的桌子将被删除 当项目标识符第二次到达数据库时 两条记录都被删除 label cost time x2 29 14 5 2020 01 00 00
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 使用unittest时如何知道每次测试花费的时间?

    Unittest 仅显示运行所有测试所花费的总时间 但不单独显示每个测试所花费的时间 使用unittest时如何添加每个测试的计时 我想 目前不可能 http bugs python org issue4080 http bugs pyth
  • MSSQL:如何使用代码编写存储过程创建脚本?

    我正在尝试使用一个数据库中存在但另一个数据库中不存在的 information schema routines 查询存储过程定义列表 SELECT t1 Routine Definition FROM server1 MyDatabase
  • SSIS Master 包执行来自另一个项目的包

    我有多个SSIS项目 但其中的一些包是相同的 我想创建一个包含所有内容的项目generic包并将其他项目与他们的特定包一起保存 所以我的问题是 是否有可能有一个主包可以执行并将父变量传递给另一个项目的包 我是 SSIS 新手 如果这是一个明

随机推荐

  • 有没有办法确定 Linux PID 是否暂停?

    我有一个 python 脚本 它使用 SIGSTOP 和 SIGCONT 命令与 os kill 来暂停或恢复进程 有没有办法判断相关PID是处于暂停状态还是恢复状态 您可以从进程的 proc 目录 proc
  • 基于工作流(即有向图)浏览器的编辑器

    我想提供一个所见即所得的工具 最好是基于 JavaScript 的 用于工作流程图 即有向图 我需要商业软件友好许可 其中可能包括向 OEM 支付费用 如果有必要的服务器端部分 我需要 Java 或 ColdFusion 中的它 因为我正在
  • 如何从 Entity Framework 4.3 升级到 EF 5

    目前我们正在开发 EF 4 3 我们想将其升级到 EF5 我用谷歌搜索了升级过程步骤 但没有得到任何结果 请帮我 谢谢 以下是我在 EF4 3 到 EF5 上创建的内容的两个链接 文章 将现有项目迁移到 EF 5http msdn micr
  • Hibernate:在级联删除项目时清理集合的二级缓存

    我有一个问题 Hibernate 不会为级联删除的项目集合更新二级缓存 Details 假设我们有一个对象 Parent 其中包含 Child 对象的 Parent myChildren 集合 现在我们还有 Humans 对象和 Human
  • 计算我的位置与 Swift 上的 MapKit 图钉之间的距离

    我需要你的帮助 我正在开发一个应用程序 其中有一些图钉 位置 我想要的是获取每个图钉与我的位置之间的距离 我的代码如下 let annotation MKPointAnnotation let annotationTwo MKPointAn
  • 线程池 - 可能的线程执行顺序问题

    我一直在学习如何使用线程池 但我不确定池中的每个线程是否都正确执行 并且我怀疑有些线程被执行多次 我已将代码削减到最低限度 并一直使用 Debug WriteLine 来尝试弄清楚发生了什么 但这会产生一些奇怪的结果 我的代码如下 基于 不
  • 有人在没有ant的情况下使用webtest吗?

    我想尝试使用 WebTest 最好是来自 Clojure 但我只能找到它作为 Ant 任务公开的功能 似乎有某种 Groovy 接口 这意味着可以从 Ant 之外的任何 JVM 语言使用 但我无法弄清楚 我希望使用 WebTest 作为 可
  • 如何使用java更新Google App Engine中数据存储的字段值

    我在数据存储中创建了一个登录名 种类 在登录内部 我创建了两个字段用户名和密码 当用户更改密码时 我想更新数据存储内的字段值 但是当我使用这段代码时 DatastoreService datastore DatastoreServiceFa
  • Jest不能处理insertAdjacentElement吗?

    我想测试一个非常简单的JS函数 export function displaySpinner const loadingOverlayDOM document createElement DIV const spinner document
  • 过滤流数据以减少噪声,卡尔曼滤波器c#

    我正在将数据从惯性传感器流式传输到 C 应用程序中 数据有点嘈杂 所以我需要添加一个过滤器来平滑它 我有一个卡尔曼滤波器实现 在给定数组时效果很好 但我无法理解如何在恒定数据流上使用它 I have double sensorData th
  • 安装应用程序包装脚本wrap.sh

    Android 提供了一种非常强大的方法来控制应用程序进程启动 它就是所谓的包装脚本 https android googlesource com platform frameworks base master services core
  • 在 Visual Studio 2010 的 C++ 中使用 lapack C 标头时出现错误

    请帮我 我在网上查了好几个小时还是没有找到解决办法 我正在尝试使用 call lapack 函数C 功能 但我一开始就失败了 这是我的代码 include stdafx h include targetver h extern C incl
  • 需要有关在 SQL Server 上使用 SqlBulkCopy 突破极限的建议

    我正在设计一个应用程序 其中一个方面是它应该能够将大量数据接收到 SQL 数据库中 我将数据库结构设计为具有 bigint 标识的单个表 如下所示 CREATE TABLE MainTable id bigint IDENTITY 1 1
  • 在同一包中创建单独的文件夹... [ECLIPSE]

    Eclipse 是否可以在包中创建单独的文件夹 当选择 新建 gt 文件夹 时 我的eclipse版本总是创建一个包 但我希望新文件夹位于旧包中 如何才能实现这一目标 提前致谢 Patrick 如果您没有将代码放入该文件夹中 您可能想要做的
  • 如何在 R 中绘制图例而不绘制符号并且仍然使其很好地对齐?

    我可以创建一个没有绘图符号并且文本本身适合边框的绘图图例吗 例如 在以下代码中 我想要删除的图例文本之前有一个间隙 plot c 1 2 3 c 1 1 1 abline v c 1 5 2 2 5 col c blue red green
  • 区分大小写 Kotlin /ignoreCase

    我试图忽略字符串的大小写敏感性 例如 用户可以输入 巴西 或 巴西 就会触发乐趣 我该如何实施 我是科特林新手 fun questionFour val edittextCountry findViewById
  • 从反应中获取多个输出

    我需要从闪亮的反应组件中获得多个输出 例子 output a output b lt reactive a lt input abc b lt input abc 10 a b 如何完成类似上面的事情 通过它我可以获得两个输出a and b
  • Epub.js - 由于 blob URI,Phonegap 无法工作

    我正在使用 Epub js 库在 Phonegap 项目中渲染 epub 文件 文件被正确获取并解压缩 但如果在 WebView 中运行 屏幕会显示空白 在桌面和 Android 浏览器 Chrome 应用程序 中完美运行 调试 我看到if
  • 选择父菜单应显示子菜单

    我正在开发一个 Wordpress 网站并尝试显示我的菜单 如图所示 如何在选择父菜单时显示子菜单 您可以像这样创建带有辅助嵌套的主要顶部链接 ul class primary li Tutorial li ul class seconda
  • SQL 效率:WHERE IN 子查询与 JOIN then GROUP

    例如 我想获取应用了某些标签的所有项目的列表 我可以执行以下任一操作 SELECT Item ID Item Name FROM Item WHERE Item ID IN SELECT ItemTag ItemID FROM ItemTa