2013-08-29 36 views
0

我確實意識到我面臨的問題不是火箭科學,但仍然沒有找到任何關於解決此問題的信息。SQL Select語句 - 多個表格允許空值

我在我的數據庫中有多個表(PSQL)我想創建一個select查詢來爲我的應用程序生成報告功能。

這裏是我的查詢:

select 
    s.id, s.name, st.name, p.firstname || ' ' || p.lastname, 
    f.name, f.store_date, bdt.name, bd.comment 
from 
    system s, systemstatus st, role w, person p, file f, 
    documenttype bdt, document bd 
where 
    w.system_id = s.id and 
    p.id = w.person_id and 
    st.id = s.status_id and 
    bd.system_id = s.id and 
    bd.file_id = f.id and 
    bd.type_id = bdt.id and 
    bd.role_id = w.id; 

查詢工作,我得到300行完全充滿值我正在尋找。問題是我在System表中有大約1000行。有可能沒有PersonDocument這可能與特定System連接。

我想看到的是在我System表中所有行(我的意思是約1000),當我不能System鏈接PersonDocument我希望字段爲空(現在它不顯示全部)

+0

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 在ANSI - ** 92 ** SQL標準中**舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法(**超過20年**前),其使用是不鼓勵 –

回答

3

主要部分是 - 你需要left outer join
答案的其他部分 - 使用ANSI join syntax和格式化您的疑問:

select 
    s.id, s.name, st.name, p.firstname || ' ' || p.lastname, f.name, 
    f.store_date, bdt.name, bd.comment 
from system as s 
    left outer join systemstatus as st on st.id= s.status_id 
    left outer join role as w on w.system_id = s.id 
    left outer join person as p on p.id = w.person_id 
    left outer join document as bd on bd.system_id = s.id and bd.role_id = w.id 
    left outer join documenttype as bdt on bdt.id = bd.type_id 
    left outer join file as f on f.id = bd.file_id 

一定要記住的是,有人一天閱讀你的代碼(可能是這將是未來的你:)) - 這樣的可讀性罪狀!

0

您正在查詢中通過「where」子句連接您的表,該子句等於內部連接。相反,你應該離開的人加入和文檔表,系統表,例如:答案

select * 
from system s 
left join role w on w.system_id = s.id 
left join person p on p.id = w.person_id 
+0

我會嘗試這一點,並保持你張貼。感謝諮詢! – Mithrand1r