我正在使用Postgres数据库和以下架构进行java应用程序:
实体employee
,rol
,project
内部包含一些信息,实体参与者为空。我想在我的应用程序中显示一个没有指定领导者的所有项目的表。我确信#s可能带有SQL查询,但我不确定如何。我试过这个问题:
SELECT p.projectnumber from participants pa, projecto p
where p.projectnumber=pa.projectnumber and pa.leaderid IS NULL;
但是没有返回任何行。这是因为参与者实体是空的,但我不能仅用项目编号来填充该实体。你认为我可以通过查询或任何其他建议更容易吗?
答案 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
对于大多数列?为什么project
和projecto
之间没有FK约束?为什么查询中为project
,而ER图中为{{1}}?等