您需要员工上的几个自联接表。 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