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 个表,其中一个是可选的的主要内容,如果未能解决你的问题,请参考以下文章
TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。