我正在使用Postgres数据库和以下模式开发一个java应用程序:
实体employee
,rol
,project
内部有一些信息,实体参与者为空。我想在我的应用程序中显示一个表,其中列出了所有尚未分配领导的项目。我确信SQL查询可以做到这一点,但我不确定如何做到这一点。我试过这个问题:
SELECT p.projectnumber from participants pa, projecto p
where p.projectnumber=pa.projectnumber and pa.leaderid IS NULL;
但不返回行。这是因为参与者实体是空的,但是我不能只用projectnumbers填充该实体。你认为我可以通过一个问题或者其他建议来简化这个过程吗?
最佳答案
我想在我的应用程序中显示一个表,该表显示所有尚未分配领导的项目
猜测在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
来解决它,但是在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
中。在这个特定的查询中,结果仍然是正确的(没有参与者,没有领导者)。但它会返回一行,每个参与者不是领导者,我希望你想列出每一个领导者少项目一次。你必须聚合,但为什么要首先加入多个非领导者?基础知识:
Select rows which are not present in other table
撇开这一点,你的关系设计似乎并不合算。如何防止同一个项目的多个领导者?为什么对大多数列
varchar(30)
?为什么在participant
和project
之间没有FK约束?为什么在查询中projecto
,而在ER图中project
?等。关于sql - 查询以查找没有领导者的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33989924/