2009-11-25 93 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寫,但有時候不能。