查询没有领导者的项目

时间:2015-11-30 00:43:37

标签: sql postgresql select

我正在使用Postgres数据库和以下架构进行java应用程序:

enter image description here

实体employeerolproject内部包含一些信息,实体参与者为空。我想在我的应用程序中显示一个没有指定领导者的所有项目的表。我确信#s可能带有SQL查询,但我不确定如何。我试过这个问题:

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用左连接,假设参与者表中没有条目的项目没有领导者:

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

答案 1 :(得分:1)

  

我想在我的应用程序中显示一个表格,其中显示尚未分配Leader的所有项目

通过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;

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

基础:

除此之外,你的关系设计似乎并没有加起来。为同一个项目阻止多个领导者的原因是什么?为什么participant对于大多数列?为什么projectprojecto之间没有FK约束?为什么查询中为project,而ER图中为{{1}}?等