关于Oracle SQL中NOT IN子句的工作机制

Posted

技术标签:

【中文标题】关于Oracle SQL中NOT IN子句的工作机制【英文标题】:Regarding the working mechanism of NOT IN clause in Oracle SQL 【发布时间】:2018-04-22 18:01:09 【问题描述】:

以下是我的 sql 查询的结果:

SELECT DISTINCT(department_id) 
from employees 
ORDER BY department_id;

结果:

DEPARTMENT_ID

       10
       20
       30
       40
       50
       60
       70
       80
       90
      100
      110

然后:

SELECT department_id 
FROM departments 
ORDER BY department_id;

DEPARTMENT_ID

       10
       20
       30
       40
       50
       60
       70
       80
       90
      100
      110
      120
      130
      140
      150
      160
      170
      180
      190
      200
      210
      220
      230
      240
      250
      260
      270

当我执行以下查询时,我得到了结果:

SELECT department_id 
from departments  
where department_id IN (select distinct(department_id) from employees)  
ORDER BY department_id;

DEPARTMENT_ID

       10
       20
       30
       40
       50
       60
       70
       80
       90
      100
      110

但是,当我执行以下查询时,以下查询返回“NO Rows Selected”:

SELECT department_id 
from departments  
WHERE department_id NOT IN (select distinct(department_id) from employees)   
ORDER BY department_id;

我所期望的是员工表中不存在的部门 ID。 我觉得这是初学者的错误,但是我无法解决此问题。任何帮助将不胜感激。

【问题讨论】:

请显示示例输入数据(表格行值) 员工表中是否有任何您未向我们显示的空部门 ID? SQL NOT IN not working的可能重复 @Martin Smith Yepp 确实如此!在阅读了下面 Gordon Linoff 的答案后,我明白了这一点。但是,我仍然不清楚为什么一名员工的部门 ID 为空值导致查询没有结果。你能帮我解决这个问题吗?提前致谢 我试着在这里解释一下。不知道有多成功...dba.stackexchange.com/questions/48643/… 【参考方案1】:

这是因为employees isNULL. When any value in theNOT INlist isNULL`中至少有一个department_id,根本没有返回任何行。

要解决这个问题,我只是建议始终使用带有子查询的NOT EXISTS

SELECT d.department_id 
FROM departments d
WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE d.department_id = e.department_id)   
ORDER BY d.department_id;

(或使用LEFT JOIN/WHERE。)

可以在子查询中使用WHERE 子句解决此问题。我认为最好使用符合您预期的构造。

【讨论】:

感谢您的回答!!但是,我猜结果需要按 d.department_id 排序!! :)

以上是关于关于Oracle SQL中NOT IN子句的工作机制的主要内容,如果未能解决你的问题,请参考以下文章

关于SQLserver 存储过程 如何切割一个字符串 转化为数组

oracle sql语句学习

Oracle:如何在 SQL 查询中实现“自然”排序?

关于ORACLE中SELECT INTO 语句有使用集合函数时不会出现no data found 异常

oracle 中动态sql语句,表名为变量,怎么解

oracle 19c虚拟要下自动索引测试