我确实意识到我面临的问题不是火箭科学,但我仍然没有找到任何有关解决这个问题的信息。
我的数据库中有多个表(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
行。可能没有Person
或Document
可以与特定System
相关联。
我希望看到System
表中的所有行(我的意思是大约1000),以及当我无法将Person
或Document
与{{1}相关联时我希望该字段为空(现在它根本没有显示)
答案 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