SQL Select语句 - 多个表允许空值

时间:2013-08-29 06:58:49

标签: sql postgresql

我确实意识到我面临的问题不是火箭科学,但我仍然没有找到任何有关解决这个问题的信息。

我的数据库中有多个表(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行完全填满我正在搜索的值。问题是我在1000表中有大约System行。可能没有PersonDocument可以与特定System相关联。

我希望看到System表中的所有行(我的意思是大约1000),以及当我无法将PersonDocument与{{1}相关联时我希望该字段为空(现在它根本没有显示)

2 个答案:

答案 0 :(得分: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

永远记住有人会在某一天阅读你的代码(可能会是未来你:)) - 所以可读性很重要!

答案 1 :(得分:0)

您通过“where”子句在查询中连接表,该子句等于内连接。相反,您应该将Person和Document表连接到System表,例如:

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