2017-06-12 41 views
0

数据库的新手。我有一个架构如下:Postgresql与外部联接以包含空值

Employee(**eid**, pname, age) 
Dept(**dname**, num_managers)/Dept = department 
Dept_Wing(**wingno**, wing_name, dname)/Dept_Wing = which wing of department 
Wing_Sub_Division(**dname**, **wingno**, **sub_div_no**)/Wing_Sub_Division = which sub-division of the wing 
On_Duty(**eid**, **dname**, **wingno**, sub_div_no) 

我想要得到的:DNAME,wingno,数量值班的每个机翼 和所有的翅膀比总数的职责有不到15名%的员工员工(所以这包括有0名值班员工的部门)。

我试图

select w.wingo, od.wingo 
from dept_wing w left outer join on_duty od on on w.wingo=od.wingno 

只是为了让所有这些甚至已经没有员工值班的翅膀,但我不能,甚至回到那些翅膀!任何指导表示赞赏!

+0

你没有得到任何结果或错误消息?我问,因为你的FROM子句在wingo列上指定了一个连接,但是你的模式调用了这些wingno(即用n)。 – Ben

+0

对不起,这是我的错字!没有“wingo”这样的列,所以我将它固定到wingno –

+0

您说的是查询运行,但不返回行?这应该。即使太多了。 –

回答

0

看来你正在使用复合键;一个部门由dnamewingno标识,因此您在Dept_Wing,Wing_Sub_DivisionOn_Duty中有一对。这使得这个查询非常简单。

这里是如何让员工的数量每翼职责:

select dname, wingno, count(*) 
from on_duty 
group by dname, wingno 

所以整个查询

select 
    wing.dname, wing.wingno, coalesce(duty.cnt, 0) as employees_on_duty 
from dept_wing wing 
left join 
(
    select dname, wingno, count(*) as cnt 
    from on_duty 
    group by dname, wingno 
) duty on duty.dname = wing.dname and duty.wingno = wing.wingno 
where coalesce(duty.cnt, 0) < 0.15 * (select count(*) from employee); 
+0

感谢您的帮助!在第一个“从......”的声明中试图思考这个......应该是“dept_wing wing”吗?我假设你的意思是“dept_wing”是正确的? –

+0

'wing'是一个别名。如果你喜欢这个,使用'w'。 –

+0

哦,对不起,谢谢! –