1. 程式人生 > >Oracle 的關聯子查詢(correlated subquery) 簡介.

Oracle 的關聯子查詢(correlated subquery) 簡介.

相信 接觸過 ocp考題既, 都會見到 correlated subquery的字眼.

correlated subquery的中文名稱就是相關子查詢呢?

1. 什麼是子查詢

這個很簡單,  子查詢就是巢狀在主查詢裡的查詢了.

例如, 在scott 模式下我想查詢所有比Allen 工資高的員工

我們可以寫成這樣:

select a.* from emp a, emp b
where a.sal > b.sal
and b.ename = 'ALLEN'

當然上面的查詢語句自不過是簡單的連線查詢, 並沒有用到子查詢.

寫成這樣就是子查詢了:

select * from emp 
where sal > ( select sal from emp where ename = 'ALLEN')

第二行where 條件中出現了另1個子查詢.  反而令sql語句更加容易理解了.

2. 什麼是非關聯子查詢

而子查詢也可以分成關聯子查詢和非關聯子查詢,  上面那條sql 語句就是非關聯子查詢.

所謂非關聯子查詢就是 指子查詢可以脫離主查詢獨立執行.

再舉個例子:

我想找出每個部門中最高工資的人.

sql語句可以寫成如下:

select a.deptno,a.* from emp a
where (a.deptno, a.sal) in (select deptno, max(sal) from emp group by deptno)

其中的 子查詢
select deptno, max(sal) from emp group by deptno

是可以獨立執行的.

而且對於整個查詢來講, 是執行一次子查詢先, 再執行主查詢.

3. 什麼是關聯子查詢

所謂關聯子查詢就是指子查詢與主查詢之間有條件關聯,  不能獨自執行.

看回上面的需求, 我們換一種寫法:

select a.deptno, a.* from emp a
where a.sal = (select max(b.sal) from emp b where b.deptno =  a.deptno)

上面的例子就是用到關聯子查詢了,  其中的子查詢因為條件關聯了主查詢的表. 所以子查詢不能單獨執行.

對於關聯子查詢來講,  是自外到內的, 先執行外查詢,.

例如上面的例子,   對於主表a來間,  對於每1個deptno,  都要執行一次子查詢.

關聯子查詢還有1個限制, 就是子查詢不能返回多於1行的資料.

否則會出現如下的錯誤資訊:


ORA-01427: 單行子查詢返回多個行
01427. 00000 -  "single-row subquery returns more than one row"
*Cause:    
*Action: