您需要員工上的幾個自聯接表。 One代表監督員與員工的關係。 第二個代表員工之間的同伴關係。
這裏是否存在級聯計算器PostgreSQL的
的SQL
下降模式;
create schema stackoverflow;
將search_path設置爲stackoverflow,public;
創建表僱員
(
id serial not null unique,
name text not null unique,
title text not null,
primary key (id)
);
創建表報告
(
supervisorid integer not null references employee (id) on delete cascade ,
subordinateid integer not null references employee (id)
check (supervisorid != subordinateid),
unique (supervisorid, subordinateid),
unique(subordinateid)
);
創建表等
(
supervisorid integer not null references employee (id) on delete cascade ,
peerid integer not null references employee (id)
check (supervisorid != peerid),
unique (supervisorid, peerid)
);
創建或替換視圖directreports作爲
select supervisor.id as "supervisor id",
supervisor.name as "supervisor name",
reporting.id as "employee id", reporting.name as "employee name"
from
employee supervisor, employee reporting , reports
where
supervisor.id = reports.supervisorid
and reporting.id = reports.subordinateid;
create or replace view peerreports as
SELECT * FROM directreports,對等體,僱員
where
employee.id = peer.peerid
and peer.supervisorid = directreports."supervisor id";
插入到僱員(姓名,頭銜)
values ('c head', 'c head'),
('d head', 'd head'),
('c emp1', 'c emp1') ,
('c emp2', 'c emp2') ;
insert into reports
select employee.id as "supervisorid",
reportsto.id as "subordinateid"
from employee, employee reportsto
where employee.name = 'c head'
and reportsto.name in ('c emp1', 'c emp2')
and reportsto.name != employee.name ;
insert into peer
select employee.id as "supervisorid",
peerto.id as "peer.peerid"
from employee, employee peerto
where employee.name = 'c head' and peerto.name = 'd head'
and employee.id != peerto.id;
這裏是典型查詢
select * from employee;
select * from reports;
select * from directreports;
select * from peer;
select * from peerreports,employee where employee.name ='d head';
喬爾布朗指出你的嵌套集合將幫助你瀏覽樹,但是你的層次結構有問題。如果'Staff C'報告給'Section C',爲什麼它低於'Executive B'? – 2012-08-15 12:17:56
在架構中,員工C是多人交叉報告。根據公司結構,他在B組執行,但是對於一些特定的工作,他必須向科長C和科長D報告。 – Sutha 2012-08-17 02:48:35