2017-06-12 40 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

哦,對不起,謝謝! –