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

Posted

技术标签:

【中文标题】SQL 连接 3 个表,其中一个是可选的【英文标题】:SQL joins with 3 tables from which one is optional 【发布时间】:2014-02-17 22:20:53 【问题描述】:

我已经存在 mysql 数据库,我尝试在其中获取与给定项目编号的“ProjectId”或“ProjectScopeChangeID”相关的所有“Job”条目。有些项目有 ProjectScopeChange,有些没有。

这对我来说是 3 个表的不寻常关系,在尝试了它们的各种连接组合后,我已经迷失了。这是问题部分的架构:

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 是一对多的关系,所以 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 是 ProjectID 4 的 PSC,但没有工作)

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

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

【问题讨论】:

好吧,我终于通过在前 2 个选择语句上使用 UNION 得到了结果(并将选择列修改为仅来自 PDJ 表),但在我看来这不是正确的方法正在做。我仍然认为它是正确的 JOIN 挑战,所以我仍然想知道如何仅使用 JOIN(没有 UNION)来完成它。有可能吗? 【参考方案1】:

试试这个:

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

【讨论】:

谢谢你,Saharsh,但这给了我与仅加载项目时相同的结果(除了 projectScopeChangeID 列为 null) - 正是预期结果的前 3 行 抱歉,Saharsh,忘记了。现在它在那里。基本上,PDJ 有 project 或 psc 的 ID,另一个为 null 好吧,很遗憾你的建议没有奏效。因为实际的最终查询比这个例子要复杂一些,并且使用了更多的表连接,所以使用 UNION 时唯一的问题是,所有的东西都必须写两次,包括参数。但这是一个小问题;o)

以上是关于SQL 连接 3 个表,其中一个是可选的的主要内容,如果未能解决你的问题,请参考以下文章

SQL 连接问题

在swift中,为什么UIlabel是可选的?

TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。

参数动作 其中T3可以是可选的

sql语句的基本用法总结

为啥 C# 3.0 对象初始值设定项构造函数括号是可选的?