我正在使用Postgres数据库和以下模式开发一个java应用程序:
sql - 查询以查找没有领导者的项目-LMLPHP
实体employeerolproject内部有一些信息,实体参与者为空。我想在我的应用程序中显示一个表,其中列出了所有尚未分配领导的项目。我确信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)?为什么在participantproject之间没有FK约束?为什么在查询中projecto,而在ER图中project?等。

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

10-14 02:15