天天看點

Oracle資料庫自連接配接查詢的缺點及解決方法

       問題:我們在Oracle資料庫中,如果需求要查詢出 EMP 表中的所有員工及員工對應的上司時,就需要用到自連接配接查詢:

查詢語句如下:

select e.empno,e.ename,e.mgr from emp e,emp b
where e.empno = b.mgr;
           

       但是,我們知道,自連接配接至少需要有兩張表,并且會進行笛卡爾全集,(笛卡爾積:兩張表行數的乘積)是以自連接配接查詢出來的記錄會是此表資料量的平方。

是以,自連接配接查詢的缺點很明顯:不适合操作大表。

解決辦法:層次查詢。

        層次查詢是單表查詢,不存在産生笛卡爾積。層次查詢在某些情況下可以替代自連接配接,本質上是單表查詢。是以,對于大表需要自連接配接查詢時,我們可以使用層次查詢來拟補自連接配接的缺點及帶來的問題。

層次查詢語句:

select empno,ename,mgr from emp
connect by prior empno = mgr
start with empno = 7369;
           

層次查詢不用 where 表示,用 connect by 表示,start with 是從樹的那個節點開始查詢。如果是從根節點也可以用start with mgr is null; 來查詢出所有節點的結果。當然,也可以對層次查詢的深度進行表示,比如用level來表示層次深度,那麼我們的查詢語句可以寫成:

select level,empno,ename,mgr from emp
connect by prior empno = mgr
start with mgr is null
order by 1;
           

       其中,mgr is null 表示是從根節點開始查詢的,如果不是從根節點開始的使用第一種方式。

自連接配接與層次查詢的比較:

自連接配接:自連接配接得到的查詢結果比較直覺但是不适合操作大表。

層次查詢:層次查詢隻涉及一張表,不産生笛卡爾積,但得到的結果可能不太直覺。

       總結:不同的查詢語句有不同的特點,都不是萬能的。

推薦趙強老師的視訊講解:https://www.imooc.com/video/8513/0