首页 > 解决方案 > 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。

标签: sqloracleexists

解决方案


这是您的第一个查询:

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;

推荐阅读