我已经存在MySQL DB,在这里我尝试获得与给定项目号有关的“ProjeDeD”或“ProjistCopeCeNeCeEnID”的所有“作业”条目。有些项目有ProjectScopeChange,有些则没有。
这对我来说是3个表之间不寻常的关系,在尝试了各种连接组合之后,我已经迷失了。这是问题部分的架构:
ProjectScopeChange表中的数据如下所示:

projectScopeChanngeID project
2                     4
4                     4

计划的纪律作业表如下所示:
 plannedDisciplineJobID projectID   projectScopeChangeID
 1                      4               {null}
 2                      4               {null}
 14                     4               {null}
 4                     {null}           2

而且由于Project-PSC是一对多关系,Project没有任何关于PSC的专栏。
基本上,如果我只想获得项目的所有作业,我将使用以下代码:
select p.projectID,
pdj.plannedDisciplineJobID

from project p,
planneddisciplinejob pdj

where p.projectID = pdj.projectID
  and p.number = ?

另外,如果我想为PSC找到所有的工作,我会用:
select p.projectID,
psc.projectScopeChangeID,
pdj.plannedDisciplineJobID

from project p,
projectscopechange psc,
planneddisciplinejob pdj

where pdj.projectScopeChangeID = psc.projectScopeChangeID
  and p.projectID = psc.project
  and p.number = ?

但是,当我试着把它组合成这样:
select p.projectID,
psc.projectScopeChangeID,
pdj.plannedDisciplineJobID

from project p
left join projectscopechange psc
on p.projectID = psc.project,
planneddisciplinejob pdj

where p.number = ?
  and (pdj.projectID = p.projectID
    or pdj.projectScopeChangeID = psc.projectScopeChangeID)

它只会导致一个组合
projectID   projectScopeChangeID    plannedDisciplineJobID
4           2                       1
4           2                       2
4           2                       4
4           2                       14
4           4                       1
4           4                       2
4           4                       14

而不是预期的(4是projectd4的PSC,但没有作业)
projectID   projectScopeChangeID    plannedDisciplineJobID
4           {null}                  1
4           {null}                  2
4           {null}                  14
4           2                       4

提前感谢您的任何提示,以获得正确的结果

最佳答案

试试这个:

SELECT p.projectID, psc.projectScopeChangeID, pdj.plannedDisciplineJobID
FROM project p
INNER JOIN planneddisciplinejob pdj ON pdj.projectID = p.projectID
LEFT JOIN projectscopechange psc ON pdj.projectScopeChangeID = psc.projectScopeChangeID
WHERE p.number = ?

08-19 10:40