sql - ORACLE EXIST(子查询)
问题描述
据我所知,SQL EXISTS 条件与子查询结合使用,如果子查询返回至少一行,则认为满足条件。
那么为什么这些代码会给出不同的结果呢?
/* #1 */
SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM employees
WHERE employees.department_id= 20);
/* #2 */
SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM departments
WHERE employees.department_id= 20);
我想如果任何子查询返回任何他们评估为 TRUE 的行。因此,外部查询将返回员工表中的所有行。
但是,只有 #1 代码返回员工表中的所有行。#2 返回具有 department_id=20 的 ros。
解决方案
这是您的第一个查询:
SELECT e.*
FROM employees e
WHERE EXISTS (SELECT 1
FROM employees e2
WHERE e2.department_id = 20
);
在这个查询中,innerWHERE
指的是内部表。因此,可能会发生以下两种情况之一:
employees
在那个部门有一个雇员。在这种情况下,所有员工都会在外部查询中返回。employees
该部门没有员工。在这种情况下,外部查询中不会返回任何员工。
这是全部或事情。
第二个查询是:
SELECT e.*
FROM employees e
WHERE EXISTS (SELECT 1
FROM departments d
WHERE e.department_id = 20
);
内部引用指向外部查询。对于 中的每一行employees
,查询都会查看子查询是否返回任何行。如果是,则返回该行。
子查询将返回所有行departments
(如果外部查询中的员工有department_id = 20
)或不返回任何行。所以,这相当于:
SELECT e.*
FROM employees e
WHERE e.department_id = 20;
推荐阅读
- react-native - 在反应本机获取时省略凭据
- csv - NIFI 将大型 CSV 插入 SQL 数据库
- c# - 如何使用 asp.net/C# 在网页上显示 Windows 身份验证?
- java - 如何在java中动态创建自定义xml元素(或自定义javafx场景控件)
- c++ - 推导多个参数包
- asp.net - 配置 web.config 以将具有特定模式的 URL 重定向/转发到另一个模式(带有冒号和双斜杠)
- python - Python 错误:只能将大小为 1 的数组转换为 Python 标量
- batch-file - 回声附加到文本文件
- airflow - BashOperator 不运行 bash 命令 apache 气流
- sql - 使用 bacpac 导入数据层应用程序