2009-11-25 94 views

回答

4

那么,首先它没有性能问题。它就是这样,并且考虑到硬件和数据库结构的性能限制,它将尽可能地执行。

至于什么是有用的,它只是一种表达特定逻辑条件的方式。

+0

为什么它不会有性能问题,因为它首先在外部查询中查找记录,然后将其传递给内部查询,然后内部查询将根据再次外部查询选择预期结果而给出一些结果...... – hrishi 2009-11-25 10:57:33

+3

@hrishi:因为这不是它所做的。 SQL是声明式的,所以你可以编写你想要的结果,而不是通过操作来获得结果。确定如何检索结果是查询优化器的一项工作。 – erikkallen 2009-11-25 11:06:33

+5

你所描述的几乎是一个加入。优化过程的查询转换阶段可以将相关的子查询转换为连接,并且可以实现为散列连接或嵌套循环(等等)。对非常大的未索引表的相关子查询可能是一个性能问题,但这是因为连接效率低下,并不是因为用SQL指定它的语法意味着数据库操作本身不够高效。 – 2009-11-25 11:06:37

6

一个常见的用法例如:各部门的最新雇用的雇员(S)的显示细节:

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 
        ); 
+0

这是我在SO中看到的关于使用相关子查询的最清楚的用法。 – dbustosp 2017-06-21 03:12:23

2

相关子查询中使用的一些必须采取行动上依赖于一个在查询中的每一行或来自该行的更多值。

所以,举例来说,如果你想知道包括基于东西在另一个表中发生的结果集的行,你可以这样做:

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

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

同样

有时候这些查询可以用标准的JOIN写,但有时候不能。