sql - 查询查找没有领导者的项目

标签 sql postgresql select

我正在使用 Postgres 数据库和以下架构创建一个 Java 应用程序:

enter image description here

实体employeerolproject里面有一些信息,实体participant为空。我想在我的应用程序中显示尚未分配领导者的所有项目的表格。我确信 SQL 查询可以实现这一点,但我不确定如何实现。我尝试了这个查询:

SELECT p.projectnumber from participants pa, projecto p
where p.projectnumber=pa.projectnumber and pa.leaderid IS NULL;

但没有返回任何行。这是因为参与者实体是空的,但我无法仅用项目编号填充该实体。您认为我可以通过查询或其他建议让事情变得更容易吗?

最佳答案

I want to show on my application a table that shows all the projects with no Leader assigned yet

猜测领导者是通过 participants.leaderid 中具有非空值来表示的:

SELECT projectnumber
FROM   projecto p
WHERE  NOT EXISTS (
   SELECT 1
   FROM   participants
   WHERE  projectnumber = p.projectnumber
   AND    leaderid IS NOT NULL
   );

您也可以使用LEFT JOIN 来解决该问题,但随后在连接条件中包含leaderid:

SELECT p.projectnumber
FROM   projecto p
LEFT   JOIN participants pa ON pa.projectnumber = p.projectnumber
                           AND pa.leaderid IS NOT NULL
WHERE  pa.projectnumber IS NULL;

WHERE条件(LEFT JOIN之后)中对leaderid的检查无法区分列是否leaderid 在基础表中为 NULL,或者因为 participants 中根本没有连接行。在这个特定的查询中,结果仍然是正确的(没有参与者,没有领导者)。但它会为每个不是领导者的参与者返回一行,并且我希望您只想列出每个无领导者项目一次。你必须聚合,但为什么一开始就加入多个非领导者呢?

基础知识:

除此之外,你的关系设计似乎并不合理。如何防止同一个项目有多个领导者?为什么大多数列都使用varchar(30)?为什么参与者项目之间没有FK约束?为什么查询中出现 projecto,而 ER 图中出现 project?等等

关于sql - 查询查找没有领导者的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33989924/

相关文章:

sql - 如何在 bigint[] 表单 postgresql 中获取最后一个元素和长度

matlab - 来自 PostgreSQL 的 Octave 数据库包时间戳

sql - 在 PostGIS 中查找包含一个点的所有多边形

sql - Oracle SQL - 没有数据时需要虚拟日期值

c++ - 使基于选择的循环尽可能响应

SQL Server 将 varbinary 转换为字符串

sql - Spark SQL : how to create sessionId for user-item

sql - PostgreSQL:保留排序顺序/临时索引/分页

python - Django:加载转储后 syncdb 不创建新表

mysql - 选择...分组依据