SQL连接3个表,其中一个是可选的

时间:2014-01-27 07:00:13

标签: mysql sql select join left-join

我已经存在MySQL DB,我尝试获取与给定项目编号相关的'ProjectId'或'ProjectScopeChangeID'的所有'Job'条目。有些项目有ProjectScopeChange,有些没有。

这对我来说是3个表的异常关系,我在尝试各种连接组合后已经丢失了。这是问题部分的模式: the problem part

ProjectScopeChange表中的数据如下所示:

projectScopeChanngeID project
2                     4
4                     4

PlannedDisciplineJob表如下所示:

 plannedDisciplineJobID projectID   projectScopeChangeID
 1                      4               {null}  
 2                      4               {null}  
 14                     4               {null}  
 4                     {null}           2

由于Project-PSC是一对多的关系,项目没有关于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是ProjectID 4的PSC,但没有工作)

projectID   projectScopeChangeID    plannedDisciplineJobID
4           {null}                  1
4           {null}                  2
4           {null}                  14
4           2                       4

提前感谢任何提示导致正确结果的提示

1 个答案:

答案 0 :(得分:0)

试试这个:

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 = ?