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中尝试过,效果很好。很高兴你指出了这一点。