【问题标题】:EXISTS clause and JOINEXISTS 子句和 JOIN
【发布时间】:2015-12-24 19:20:46
【问题描述】:

查询 1

select ename,deptno 
from emp1 
where exists 
(select deptno from dpt where dpt.deptno=emp1.deptno AND deptno>20);

返回与施加在子查询中的 deptno 字段上的条件相对应的 ename

查询 2

select ename,deptno 
from emp1 
where exists 
(select deptno from dpt where deptno>20);

但在查询 2 中,结果包含字段 ename 和 deptno 的所有值

是什么改变了两个查询中的结果集?是因为连接吗?联接实际上如何在查询 1 中带来不同的结果集?为什么在查询 1 中考虑 where 条件而不在查询 2 中考虑?

 legends:
 empname is employee name in the table emp,
 deptno is department no. which is the common field in emp and dept tables.

【问题讨论】:

    标签: sql oracle oracle11g sqlplus


    【解决方案1】:

    第一个查询是相关子查询

    相关子查询是使用外部值的子查询 询问。 在这种情况下,必须为每一行执行内部查询 外部查询。

    select ename,deptno 
    from emp1 
    where exists 
    (select deptno from dpt where dpt.deptno=emp1.deptno AND deptno>20);
    

    你可以改写成:

    select e.ename, e.deptno 
    from emp1 e
    join dpt d
      on d.deptno = e.deptno
    where d.deptno > 20;
    

    第二个查询(非相关/简单子查询):

    不相关的子查询是独立于外部的子查询 查询,它可以自己执行,而不依赖于主外部 查询。

    select ename,deptno 
    from emp1 
    where exists 
      (select deptno from dpt where deptno>20);
    

    等价于(如果存在的话就是子查询):

    select ename,deptno 
    from emp1 
    where 1 = 1
    

    或者(如果子查询什么都不返回):

    select ename,deptno 
    from emp1 
    where 1 = 0
    

    【讨论】:

    • 我非常感谢您解释事物的方法。所以基本上一个相关的子查询是当外部查询中的表和子查询中的表之间存在关系(连接)时?非常感谢您的回复。
    • @ManushreeMishra 相关子查询是指从子查询到外部查询。在您的示例中where dpt.deptno=emp1.deptno。线索是对来自外部查询的每一行执行相关子查询,并且执行一次非相关子查询
    • 所以引用基本上是通过内部连接完成的,或者也可以这样完成:emp.deptno inside a subquery?
    • @ManushreeMishra 是的,可以通过参考emp.deptno 来完成。请记住,您需要两次引用同一个表,例如:SELECT * FROM emp1 e1 WHERE EXISTS (SELECT * FROM emp1 e2 WHERE e1.deptno = e2.deptno AND ...
    • @ManushreeMishra 当您使用ONWHERE 时,emp.deptno=dpt.deptno or dpt.deptno=emp.deptno 之间没有区别。就像在数学中 a = b 与 b = a 一样
    猜你喜欢
    • 2011-10-28
    • 2010-12-17
    • 1970-01-01
    • 2021-10-21
    • 2016-04-03
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    相关资源
    最近更新 更多