Sql 相关子查询的使用

Sql 相关子查询的使用,sql,oracle,Sql,Oracle,即使它有性能问题,我可以知道相关子查询的用途吗?首先,它没有性能问题。它就是这样,并且将在硬件和数据库结构的性能约束下尽可能地执行它 至于它的用途,它只是表示特定逻辑条件的一种方式 一个常见用法示例:显示每个部门最新雇用员工的详细信息: select e.deptno, e.empno, e.ename, e.hiredate, e.sal from emp e where e.hiredate = (select max(e2.hiredate)

即使它有性能问题,我可以知道相关子查询的用途吗?

首先,它没有性能问题。它就是这样,并且将在硬件和数据库结构的性能约束下尽可能地执行它


至于它的用途,它只是表示特定逻辑条件的一种方式

一个常见用法示例:显示每个部门最新雇用员工的详细信息:

select e.deptno, e.empno, e.ename, e.hiredate, e.sal
from   emp e
where  e.hiredate = (select max(e2.hiredate)
                     from   emp e2
                     where  e2.deptno = e.deptno -- the correlation
                    );

使用相关子查询时,必须对查询中依赖于该行的一个或多个值的每一行执行某些操作

因此,例如,如果您想知道根据另一个表中发生的事情在结果集中包含一行,您可以执行以下操作:

SELECT * FROM YourTable YT WHERE 
EXISTS (SELECT * FROM SomeOtherTable SOT WHERE
    SOT.ID = YT.ID AND SOT.SomeInteger BETWEEN YT.LowInteger AND YT.HighInteger)
同样,在更新中:

UPDATE YourTable YT SET YourColumn = 
  (SELECT SUM(SomeColumn) FROM SomeOtherTable SOT 
      WHERE SOT.ID = YT.ID AND SOT.SomeField <> YT.SomeField)

有时这些查询可以使用标准联接编写,但有时不会。

为什么它不会有性能问题,因为它首先在外部查询中找到记录,然后将其传递给内部查询,然后内部查询将根据外部查询选择的预期结果给出一些结果…@hrishi:因为它不是这样做的。SQL是声明性的,因此您需要编写所需的结果,而不是编写获得该结果的操作。确定如何检索结果是查询优化器的一项工作。您在这里描述的几乎是一个连接。优化过程的查询转换阶段可以将相关子查询转换为联接,并且可以实现为哈希联接或嵌套循环等。针对非常大的未索引表的相关子查询很可能是性能问题,但这是因为联接效率低下,这并不是因为在SQL中指定它的语法意味着天生的数据库操作不高效。这是我在本书中看到的关于相关子查询使用的最明显的用法。你能想到相关子查询必不可少的任何特殊情况吗?我猜上面的结果可以通过deptno从emp group中选择*来实现,hiredate=MAXIREDATE。@Blue潜行器在Oracle中不起作用。我不知道其他一些DBMS,因为您无法选择所有列,然后只能通过deptno进行分组。好的,我在Sybase ASE中尝试过,效果很好。很高兴你指出了这一点。