Oracle樹查詢的最重要的就是select...start with... connect by ...prior 語法了。
創建表結構如下:
CREATE TABLE DEPARTMENT_INFO_T ( DEPT_ID VARCHAR2(20) NOT NULL, DEPT_NAME VARCHAR2(20), DEPT_LEVEL NUMBER, DEPT_PID VARCHAR2(20) )
DEPT_LEVEL是作為樹的級別,在很多查詢中可以加快SQL的查詢效率。在下面演示的功能基本上不使用這個關鍵字。
DEPT_PID存儲的是上級DEPT_ID,如果是頂級父節點,該DEPT_PID為0(得補充一句,表中最好別有null記錄,這會引起全文掃描)。
1. 查找樹中的所有頂級父節點(輩份最長的人)。 假設這個樹是個目錄結構,那么第一個操作總是找出所有的頂級節點,再根據該節點找到其下屬節點。
SELECT * FROM DEPARTMENT_INFO_T WHERE DEPT_PID=0
這是個引子,沒用到樹型查詢。
2.查找一個節點的直屬子節點(所有兒子)。 如果查找的是直屬子類節點,也是不用用到樹型查詢的。
SELECT * FROM RM_DEPARTMENT_INFO_T WHERE DEPT_PID='162'
這個可以找到 DEPT_ID 為162的直屬子類節點。
3.查找一個節點的所有后代子節點(所有后代,包含自己)。
SELECT * FROM RM_DEPARTMENT_INFO_T START WITH DEPT_ID='167' CONNECT BY DEPT_PID = PRIOR DEPT_ID
這個查找的是 DEPT_ID 為167的節點下的所有直屬子類節點,包括子輩的和孫子輩的所有直屬節點,包含自己。
4.查找一個節點的直屬父節點(父親)。
SELECT b.* FROM RM_DEPARTMENT_INFO_T a JOIN RM_DEPARTMENT_INFO_T b ON a.DEPT_PID = b.DEPT_ID WHERE a.DEPT_ID = '167';
這個找到的是 DEPT_ID 為167的節點的直屬父節點,要用到同一張表的關聯了。
5.查找一個節點的所有直屬父節點(祖宗)。
SELECT * FROM RM_DEPARTMENT_INFO_T START WITH DEPT_ID='167' CONNECT BY PRIOR DEPT_PID = DEPT_ID
這里查找的就是 DEPT_ID 為167的所有直屬父節點,打個比方就是找到一個人的父親、祖父等。但是值得注意的是這個查詢出來的結果的順序是先列出子類節點再列出父類節點,姑且認為是個倒序吧。
上面列出兩個樹型查詢方式,第3條語句和第5條語句,這兩條語句之間的區別在於prior關鍵字的位置不同,所以決定了查詢的方式不同。