Oracle 層次化查詢

2022-09-07 20:27:09 字數 3488 閱讀 2325

create table employees(

employee_id integer constraint employees_pk primary key,

manager_id integer constraint employees_fk_employees references employees(employee_id),

first_name varchar2(10) not null,

last_name varchar2(10) not null,

title varchar2(20),

salary number(6,0)

);insert into employees(employee_id,first_name,last_name,title,salary) values(1,'james','smith','ceo',800000);

insert into employees values(2,1,'ron','johnson','sales manager',600000);

insert into employees values(3,2,'fred','hobbs','sales person',200000);

insert into employees values(4,1,'susan','jones','support manager',500000);

insert into employees values(5,2,'rob','green','sales person',40000);

insert into employees values(6,4,'jane','brown','support person',45000);

insert into employees values(7,4,'jone','grey','support person',30000);

insert into employees values(8,7,'jean','blue','support person',29000);

insert into employees values(9,6,'henry','heyson','support person',30000);

insert into employees values(10,1,'kenvin','black','ops manager',100000);

insert into employees values(11,10,'keith','long','ops person',50000);

insert into employees values(12,10,'frank','howard','ops person',50000);

insert into employees values(13,10,'doreen','penn','ops person',47000);

員工的關係式乙個樹形結構,要提取不同員工之間的關係可以使用select 語句的connect by 和start with 子句執行層次化查詢。

語法:select [level],column,...

from table

[where where_condition]

start with start_condition connect by prior prior_condition

level 是乙個偽列,代表樹的第幾層。根節點的值是1,根節點的子節點是2,以此類推。

start_condition 定義了層次化查詢的起點。當編寫層次化查詢時必須指定start with 子句。例如:將start_condition 定義為 employee_id=1,表示從員工id=1開始查詢。

prior_condition 定義了父行和子行之間的關係。當編寫層次化查詢時必須指定prior_codition子句。例如將prior_condition 定義為 employee_id=manager_id,表示父節點的employee_id和子節點的manager_id之間存在相等關係。

select employee_id,manager_id,first_name,last_name 

from employees

start with employee_id=1 connect by prior employee_id=manager_id;

查詢的結果是:

1		james	smith

2 1 ron johnson

3 2 fred hobbs

5 2 rob green

4 1 susan jones

6 4 jane brown

9 6 henry heyson

7 4 jone grey

8 7 jean blue

10 1 kenvin black

11 10 keith long

12 10 frank howard

13 10 doreen penn

使用level 展示員工所處的層次:

select level,employee_id,manager_id,first_name,last_name from employees start with employee_id=1 connect by prior employee_id=manager_id order by level;
查詢結果:

1	1		james	smith

2 10 1 kenvin black

2 2 1 ron johnson

2 4 1 susan jones

3 13 10 doreen penn

3 7 4 jone grey

3 11 10 keith long

3 5 2 rob green

3 3 2 fred hobbs

3 12 10 frank howard

3 6 4 jane brown

4 8 7 jean blue

4 9 6 henry heyson

格式化層次查詢結果:

select level,lpad('-',2*(level-1))||first_name||' '||last_name as employee from employees start with employee_id=1 connect by prior employee_id=manager_id;
結果:

1	james smith

2 -ron johnson

3 -fred hobbs

3 -rob green

2 -susan jones

3 -jane brown

4 -henry heyson

3 -jone grey

4 -jean blue

2 -kenvin black

3 -keith long

3 -frank howard

3 -doreen penn

oracle 層次化查詢

1 層次化查詢 層次化 同一資料庫表中多條資料存在父子關係,形成樹狀結構。利用connect by 進行層次化查詢 按照某種規則,獲得節點路徑上的節點集合。如 select from market b start with b m id 10 b connect by prior b p id m ...

Oracle層次化查詢(新)

今天要通過乙個組織機構樹通過得到機構編號向上得到所有的父級機構的使用者列表。怎麼辦,肯定是用層次化查詢了。記得原來的文章裡邊有帖子。黏貼過來。結果發現會報錯 ora 01436 這個是因為父節點和子節點有鏈結上的錯誤,可能會出現迴圈。就是父節點的父節點又鏈結到子節點一樣,有死迴圈 後來沒辦法。最後再...

Oracle層次化查詢學習總結

1.1 概要 2 1.2 節點術語 2 1.3 使用connect by 和 start with子句3 1.4 層次查詢例項 3 1.5 從下向上查詢 4 1.6 從層次查詢中刪除節點和分支5 備註 無法顯示,請到文庫檢視 1.1 概要 我們經常可以見到組織為層次的資料,比如乙個公司的工作的人員就...