Oracle 的关联子查询(correlated subquery) 简介.
相信 接觸過(guò) ocp考題既, 都會(huì)見(jiàn)到 correlated subquery的字眼.
correlated subquery的中文名稱就是相關(guān)子查詢呢?
1. 什么是子查詢
這個(gè)很簡(jiǎn)單,? 子查詢就是嵌套在主查詢里的查詢了.
例如, 在scott 模式下我想查找所有比Allen 工資高的員工
我們可以寫(xiě)成這樣:
select a.* from emp a, emp b where a.sal > b.sal and b.ename = 'ALLEN'
當(dāng)然上面的查詢語(yǔ)句自不過(guò)是簡(jiǎn)單的連接查詢, 并沒(méi)有用到子查詢.
寫(xiě)成這樣就是子查詢了:
select * from emp where sal > ( select sal from emp where ename = 'ALLEN')第二行where 條件中出現(xiàn)了另1個(gè)子查詢.? 反而令sql語(yǔ)句更加容易理解了.
2. 什么是非關(guān)聯(lián)子查詢
而子查詢也可以分成關(guān)聯(lián)子查詢和非關(guān)聯(lián)子查詢,? 上面那條sql 語(yǔ)句就是非關(guān)聯(lián)子查詢.
所謂非關(guān)聯(lián)子查詢就是 指子查詢可以脫離主查詢獨(dú)立執(zhí)行.
再舉個(gè)例子:
我想找出每個(gè)部門(mén)中最高工資的人.
sql語(yǔ)句可以寫(xiě)成如下:
其中的 子查詢 select deptno, max(sal) from emp group by deptno
是可以獨(dú)立執(zhí)行的.
而且對(duì)于整個(gè)查詢來(lái)講, 是執(zhí)行一次子查詢先, 再執(zhí)行主查詢.
3. 什么是關(guān)聯(lián)子查詢
所謂關(guān)聯(lián)子查詢就是指子查詢與主查詢之間有條件關(guān)聯(lián),? 不能獨(dú)自執(zhí)行.
看回上面的需求, 我們換一種寫(xiě)法:
select a.deptno, a.* from emp a where a.sal = (select max(b.sal) from emp b where b.deptno = a.deptno)
上面的例子就是用到關(guān)聯(lián)子查詢了,? 其中的子查詢因?yàn)闂l件關(guān)聯(lián)了主查詢的表. 所以子查詢不能單獨(dú)執(zhí)行.
對(duì)于關(guān)聯(lián)子查詢來(lái)講,? 是自外到內(nèi)的, 先執(zhí)行外查詢,.
例如上面的例子,?? 對(duì)于主表a來(lái)間,? 對(duì)于每1個(gè)deptno,? 都要執(zhí)行一次子查詢.
關(guān)聯(lián)子查詢還有1個(gè)限制, 就是子查詢不能返回多于1行的數(shù)據(jù).
否則會(huì)出現(xiàn)如下的錯(cuò)誤信息:
ORA-01427: 單行子查詢返回多個(gè)行
01427. 00000 -? "single-row subquery returns more than one row"
*Cause:?? ?
*Action:
總結(jié)
以上是生活随笔為你收集整理的Oracle 的关联子查询(correlated subquery) 简介.的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle connet by pri
- 下一篇: Oracle 同义词(synonym)