我正在使用 Postgres 数据库和以下架构创建一个 Java 应用程序:
实体employee
、rol
、project
里面有一些信息,实体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/