将 NOT IN 转换为 NOT EXISTS

2023-11-22

在理解 NOT EXISTS 的用法时经历了一场噩梦,主要是如何转换下面的 NOT IN 解决方案,以便我能够真正理解我是如何实现结果的。 在askTom、oracle 论坛和stackoverflow 上有几篇文章,但找不到任何明显有助于理解这个问题的内容。如果我通过我的菜鸟搜索错过了它,我很抱歉。

SELECT s.S_Fname, s.S_Lname
FROM STUDENT s
WHERE s.S_Sex = 'F'
AND S.S_Id NOT IN(SELECT e.S_Id
        FROM ENROLLMENT e
        WHERE e.Mark < 70);

内容上有一些帮助,试图找到在她们注册的任何班级中分数从未低于 70 分的女学生。


当你掌握了它的窍门后,这相当简单:

SELECT s.S_Fname, s.S_Lname
FROM STUDENT s
WHERE s.S_Sex = 'F'
AND S.S_Id NOT IN(SELECT e.S_Id           -- take this line
        FROM ENROLLMENT e
        WHERE e.Mark < 70);

该线基本上比较S.S_Id与所有的e.S_Id来自子查询的值。

现在将其更改为NOT EXISTS并进行平等检查S.S_Id = e.S_Id,在子查询内:

SELECT s.S_Fname, s.S_Lname
FROM STUDENT s
WHERE s.S_Sex = 'F'
AND NOT EXISTS (SELECT e.S_Id          
        FROM ENROLLMENT e
        WHERE (e.Mark < 70)       -- if this is complex, you'll need parentheses
        AND S.S_Id = e.S_Id);

可能的微小改变是认识到(SELECT e.S_Id ...并不真正需要e.S_Id。子查询与EXISTS and NOT EXISTS只需检查是否有行返回,列值并不重要。你可以把SELECT *或那里的常数(SELECT 1很常见)或SELECT NULL甚至SELECT 1/0(是的,那会起作用!):

SELECT s.S_Fname, s.S_Lname
FROM STUDENT s
WHERE s.S_Sex = 'F'
AND NOT EXISTS (SELECT 1
        FROM ENROLLMENT e
        WHERE e.Mark < 70  
        AND S.S_Id = e.S_Id);

另一个主要考虑因素是,当您以这种方式进行转换时,(看似等效)NOT EXISTS and NOT IN仅当两者都有效时,查询的书写才真正等效S_Id列不可为空。如果e.S_Id列可以为空,NOT IN可能会导致整个查询根本不返回任何行(因为x NOT IN (a, b, c, ...)相当于x<>a AND x<>b AND ...当其中之一时,该条件不可能为真a,b,c... is NULL.)

出于类似的原因,如果s.S_Id可以为空(在这种情况下不太可能,因为它可能是主键,但在其他情况下很重要。)

所以使用它几乎总是更好NOT EXISTS,因为即使任一列可为空(S.S_Id = e.S_Idcheck 会丢弃之前带有 null 的行),通常这种行为是需要的。问题中有很多细节:不存在与不存在,在@Martin Smith 的回答中。您还会发现有一些方法可以转换NOT IN to NOT EXISTS并保留与 null 相关的(不愉快的)行为。

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

将 NOT IN 转换为 NOT EXISTS 的相关文章

  • 如何获取数字列的确切类型,包括。规模和精度?

    有没有办法知道列中列的确切类型DataTable 现在我正在这样做 DataTable st dataReader GetSchemaTable foreach DataColumn col in st Columns var type c
  • Informix:带有输出参数的程序?

    我搜索了很多 但找不到任何东西 我只是想问是否有任何方法可以创建和调用过程 Informix 没有参数 我知道如何返回一个或多个值 对于过程和函数 但这不是我想要的 如果 Informix 不允许输出参数 那就真的很奇怪了 提前致谢 EDI
  • 为什么 Sql Server 2000 上的 TSQL 对小数点的舍入不一致?

    我正在尝试计算美元金额的折扣百分比 在 50 的情况下 有时你会得到半分钱 我需要将其四舍五入到最接近的一分钱 在Sql中 我的计算如下 round retail 0 5 2 0 如果我采用以下值 我会得到不同的结果 4 39 2 49 不
  • Oracle 事务在 C++ 和 Java 之间的传播

    我们有一个现有的 C 应用程序 我们将逐步将其替换为新的基于 Java 的系统 在我们用 Java 完全重新实现所有内容之前 我们期望 C 和 Java 必须相互通信 RMI SOAP 消息传递等 我们尚未决定 现在我的经理认为我们需要 J
  • Oracle Developer Tools for Visual Studio 2019 无法正确安装

    在 VS 2019 中 ODT 使用扩展名安装 而不是像以前的版本那样作为安装文件安装 因此 从 VS 2017 升级的 EF 6 使用的 MVC 项目 edmx 文件在扩展安装后不显示数据库图表 空白黑页 编辑 xml 选项等 仅此而已
  • 运行 Sqoop 导入和导出时如何找到最佳映射器数量?

    我正在使用 Sqoop 版本 1 4 2 和 Oracle 数据库 运行 Sqoop 命令时 例如这样 sqoop import fs
  • ORACLE 在立即执行中批处理 DDL 语句

    我正在尝试在一个 Execute Immediate 语句中运行多个 ddl 语句 我认为这会很简单 但看来我错了 想法是这样的 declare v cnt number begin select count into v cnt from
  • 如何从oracle存储过程中提取out变量?

    我有存储过程 其中有很多输出变量 所以我这样调用存储过程 export const infoHR3 async gt try const sql Declare ln order qty NUMBER ln in proc qty hr N
  • Postgresql 和 jsonb - 将键/值插入多级数组

    非常类似于这个帖子 https stackoverflow com questions 58959678 postgresql add key to each objects of an jsonb array 但我很难适应他们的解决方案
  • 在旧版本的 MySQL (<5.5.0) 中模拟 TO_SECONDS()

    出于性能和简单性的原因 我想以秒的形式获取 MySQL 3 x 服务器中 DATETIME 列的内容 或者实际上任何数字类型 我只是想在使用 UNIX TIMESTAMP 时避免所有明显的时区问题 the我表中的日期确实来自不同的区域设置
  • 为什么 SQL Server 不推荐使用 SET ANSI_PADDING OFF?

    根据 MSDN BOL 在线书籍 SET ANSI PADDING http msdn microsoft com en us library ms187403 aspx 在 Microsoft SQL Server 的未来版本中 ANSI
  • EF4 和 SQL Server 2000

    我使用 EF4 和 SQL Server 2005 开发了我的网站 但当转移到临时站点时 发现他们使用 SQL Server 2000 现在我收到此错误 我认为该错误与 SQL Server 2000 有关 Incorrect syntax
  • 方法“Boolean Contains(System.String)”不支持对 SQL 的转换

    方法 Boolean Contains System String 不支持对 SQL 的转换 查询是 IsQueryable 但这停止工作 foreach string s in collection1 if s Length gt 0 q
  • Linq 选择与另一个表中的 ID 相等的项目

    我不确定这怎么可能 但我有两个表 我想通过表 1 的值从表 2 中获取值 表 1 有一个名为 rank 的外键 它是int 表 2 有一个名为 name 的值 它是string 现在表 1 的 排名 与表 2 的 ID 相关 所以当我说 v
  • 如何在 SQL 中进行广度优先搜索?

    给定一棵存储为关系的树 Parent Child 1 2 1 3 3 4 3 5 2 6 7 8 7 9 如何获取给定节点的所有后代 例如 对于 1
  • 删除或更改 ETL 中的记录

    我有一个表 我在上面构建了 ETL 服务 货物记录 到达 离开 进入表格 我已经这样做了 我的桌子将被删除 当项目标识符第二次到达数据库时 两条记录都被删除 label cost time x2 29 14 5 2020 01 00 00
  • 对 SQL 时间序列进行采样

    我有一个日期时间的时间序列 存储在 mySQL 中的双列 并且希望每分钟对时间序列进行采样 即以一分钟的间隔提取最后一个值 有没有一种有效的方法可以在一个 select 语句中执行此操作 蛮力方法将涉及选择整个系列并在客户端进行采样或为每个
  • sql查询中case语句中的布尔值

    我在选择查询中使用 case 语句 类似这样 Select col1 col2 isActive case when col3 abc then 1 else 0 end col4 from
  • 如何比较 Postgresql 中日期时间字段中的日期?

    在比较 postgresql Windows 中的版本 9 2 4 中的日期时 我遇到了一个奇怪的情况 我的表中有一列说update date与类型timestamp without timezone 客户可以仅使用日期搜索此字段 例如 2
  • max()、分组依据和排序依据

    我有以下 SQL 语句 SELECT t client id max t points AS max FROM sessions GROUP BY t client id 它只是列出了客户 ID 以及他们所获得的最大积分 现在我想按 max

随机推荐

  • 更改日期的打印格式而不将其转换为字符

    With a DateR中的对象 是否可以选择与默认不同的打印格式 Y m d 同时保持其Date班级 这format 函数将其转换回character string I start with a character string and
  • 防止 onbeforeunload 在任何情况下关闭页面

    我想防止浏览器在任何情况下或在其他情况下关闭页面 防止浏览器在以下情况下执行任何操作onbeforeunload叫做 这是我尝试过的代码 function var proxied window onbeforeunload window o
  • Mysql 创建具有多个外键的表,删除时设置为 null

    我正在尝试创建一个具有删除 更新约束的多个外键的数据库 但我收到错误代码 1005 其中包含以下 sql 脚本 CREATE TABLE Worker WorkerID smallint auto increment WorkerType
  • 如何使用 Renderscript 模糊效果而不出现伪影?

    背景 有很多地方 包括here 来展示如何使用 Renderscript 来模糊图像 如下所示 TargetApi VERSION CODES JELLY BEAN MR1 public static Bitmap renderScript
  • 使用 std430 限定符进行内存分配

    我正在使用与 SSAO 绑定的计算着色器 我在计算着色器中使用以下结构 struct Particle vec4 pAnds vec3 velocity float lifespan float age layout std430 bind
  • PHP 密码验证总是返回 false [重复]

    这个问题在这里已经有答案了 我正在使用 PHP 的密码哈希 API 来哈希并验证我正在构建的网站上的密码 但是每当我尝试验证我的密码时 它总是返回 false 我有一个 User 类 它在将密码插入数据库之前设置密码 public func
  • 如何启用表单上的所有控件?

    目前 我在启动时禁用了表单的大部分控件 因为在加载文件之前您无法使用它们 然而 一旦文件被加载 控件就应该被启用 我正在使用绑定 但我认为它们不是一个好的解决方案 其一 这是不必要的复杂性 其次 你不能对所有事情都使用绑定 例如 MenuS
  • 如何在python中使用Matlab的imresize

    我正在转移Matlab的imresize代码写入Python 我找到了 scipy 的imresize 但我从 Matlab 得到了不同的结果 如何通过python得到与Matlab相同的结果 Python scipyimresize fr
  • “脏话”过滤器[关闭]

    Closed 这个问题是无关 目前不接受答案 不是很技术性 但是 我必须在我们正在开发的新网站中实现坏词过滤器 所以我需要一个 好 坏词列表来为我的数据库提供 任何提示 方向 用谷歌环顾四周我找到了这个一个 这只是一个开始 但仅此而已 是的
  • Cocoa Core Data 新手指南

    我是众多热衷于尝试 Mac OS X 开发的未经洗礼的 NET 开发人员之一 目前我正在尝试弄清楚 Cocoa 的各种元素 但在核心数据上有点卡住了 我注意到 Web 上提供的大多数文档和资源都涉及广泛的端到端教程 从模型 生成类 基于文档
  • 如何在 pandas DataFrame 中存储公式而不是值

    是否可以像使用 Excel 电子表格一样使用 pandas DataFrame 例如 通过在列中输入公式 以便当其他列中的变量发生变化时 该列中的值会自动更改 就像是 a b c 2 3 a b 所以当我更新 2 或 3 时 该列c也会自动
  • 如何将一个字符串与另一个字符串进行比较,其中字符串之间有空格

    如何比较这两个字符串 val a fit bit versa val b fitbit 另一个例子 val a go pro hero 6 val b gopro 另一个例子 val a hero go pro 6 val b gopro
  • 将 RecyclerView CardView 单击的项目数据传递给 Activity

    我有一个关于将点击的卡片视图数据传递给活动的问题 这里是完整的故事 我有一个名为 Details 的 Activity 它的布局 Title 和 Description 中包含 2 个 TextView 我设置了一个片段 tab 1 其中包
  • 什么是CSS滚动行为属性?

    我最近注意到一个scroll behavior我可以在 css 中指定的属性 它只能有 2 个属性 inherit and initial 我以前从未听说过 见过它 所以我尝试看看它 问题是所有的链接都在解释不同的事情overflow财产
  • Python 3:何时使用字典,何时使用元组列表?

    I have id例如 监狱里的囚犯 每个囚犯都有一个名字 我知道字典如何工作 我知道元组如何工作 我知道列表如何工作 但有时我看到正在使用字典 有时看到元组列表 在我的情况下我应该使用哪一个 d 1 Mike 2 Bob 3 Tom vs
  • 如何更改 Node.js 中的默认目录? (视窗)

    当我尝试在节点上运行我的项目时 我必须编写 javascript 文件的完整路径 因为节点使用的默认值是C Users MyUser我拒绝使用它 我一直在尝试寻找如何改变这一点 但没有在任何地方找到它 我什至尝试手动搜索目录 但没有找到它
  • 为什么 .NET 程序能够在损坏的堆栈中幸存下来? (当使用错误的调用约定时)

    在VS2010中 托管调试助手会给你一个pInvokeStackImbalance异常 pInvokeStackImbalance MDA 如果您使用错误的调用约定调用函数 通常是因为您在调用 C 库时没有指定 CallingConvent
  • 我需要查看 HTML 图像地图区域

    我试图在我的图像上设置一个地图区域 但我希望它是一个八边形 所以我真的需要看看我正在绘制的内容 不幸的是 我无法设置区域标签的样式 以便我可以看到映射发生的位置 这使得我很难绘制这些区域 我每次都必须用鼠标跟随它才能知道它从哪里开始和在哪里
  • Cleartool:如何将标签应用于仅在我当前视图中的文件?

    我找不到正确的命令来将标签应用于当前视图中的文件 我尝试过以下命令 cleartool mklabel r TEST LABEL vob test a 但是 问题是该命令将应用 Test Label 为 中的每个文件添加标签vob test
  • 将 NOT IN 转换为 NOT EXISTS

    在理解 NOT EXISTS 的用法时经历了一场噩梦 主要是如何转换下面的 NOT IN 解决方案 以便我能够真正理解我是如何实现结果的 在askTom oracle 论坛和stackoverflow 上有几篇文章 但找不到任何明显有助于理