SQL Select 语句-多表允许空值

标签 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 行,其中完全填满了我要搜索的值。问题是我在 System 表中有大约 1000 行。可能没有可以与特定的 System 链接的 PersonDocument

我想查看我的 System 表中的所有行(我的意思是大约 1000),当我无法链接 PersonDocument 时System 我希望该字段为空(现在它根本不显示)

最佳答案

答案的主要部分是 - 您需要 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

永远记住,总有一天会有人阅读您的代码(也许将来就是您 :))- 因此可读性很重要!

关于SQL Select 语句-多表允许空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18504200/

相关文章:

sql - 我正在寻找广播广告调度算法/示例/经验

sql - 了解 SQL 中的 JOIN 的好方法或教程

database - PostgreSQL SELECT LIKE 日期时间

java - 应使用哪种 PostgreSQL 列类型来存储 Java BigDecimal?

java - JOOQ强制类型代码生成

python - .ebextensions 或 requirements.txt 是否首先在 Elastic Beanstalk 中运行

sql - 如何确定两个表之间共享哪些列?

c# - 从插入/更新查询中获取最后插入的 ID 返回值

sql - 在 PostgreSQL 中运行 N 个独立列更新的最佳方法是什么? SQL 规范中最好的方法是什么?

sql - 考虑重叠事件计算用户的 "busy duration"