SQL 中的多个多对多关系

Multiple many-to-many relationships in SQL

如何在同一结果集中查询多个多对多关系?

我有两个 table,我通常总是 LEFT JOIN 以获得标准结果集:

tblPROJECTS-

id  |  jobnumber  |  jobname ...
--------------------------------------------------
1   |  1000       |  Project X
2   |  2000       |  Project Y
3   |  3000       |  Project Z

tblTASKS-

id  |  tasknumber |  jobnumber  |  taskname ...
--------------------------------------------------
1   |  10         |  1000       |  Project X: Task 1
2   |  20         |  1000       |  Project X: Task 2
3   |  30         |  2000       |  Project Y: Task 1

Tasknumber 是一个 GUID,独立于 jobnumber,但永远不会与多个作业相关。

我在 jobnumber 上加入了 tblTASKS,因为并非所有项目都会有任务(还)

但是我还有一个所有者 table,它定义了 1-n 个用户,他们要么拥有整个工作,要么拥有单个任务(或两者)。每个用户可以拥有多个作业 and/or 任务。 DB 的原始设计指定使用单个 table。

tblOWNERS-

id  |  ownertype  |  ownerid  |  jobnumber  |  tasknumber ...
----------------------------------------------------------------
1   |  1          |  2        |  1000       |
2   |  1          |  4        |  1000       |
3   |  2          |  2        |             |  10

ownertype 为 1 表示用户拥有整个作业。 ownertype 为 2 表示用户拥有作业中的任务。

我有两个要构建的查询:

1) Return 具有所有关联作业所有者的作业,以及该作业的所有任务以及所有关联任务所有者。

jobnumber |  jobowners | tasknumber | taskowners ...
1000      |  2,4,...   | 10         | 2
2000      |            | 20         | 4,6,8...
3000      |  4,5,6...  | 30         | 

2) 给定所有者 ID,return 所有作业 and/or 与之关联的任务。

是多个多对多 from/to 相同的 table 让我感到难过。我能做到吗?如果是这样,我是否正在寻找某种 UNION 或 INTERSECT(我要学习什么)?或者,如果不是,那么允许这种关系的更好模式是什么?

TIA!

通常,您需要将外键放在 ERD 的多端,因此在这种情况下,您可能在 table 'tblPROJECTS' 中有一个名为 'ownerid' 的字段,以及在 tblTASKS 中有 'ownerid'。假设所有任务都有一个工作 ID 和一个所有者,并且所有项目也有一个所有者,您可以使用 INNER JOINs:

SELECT P.jobnumber,T.tasknumber,O1.id AS taskowner,O2.id AS jobowner
FROM tblTASKS T
INNER JOIN tblPROJECTS P ON P.jobnumber=T.jobnumber
INNER JOIN tblOWNERS O1 ON O1.id=T.ownerid
INNER JOIN tblOWNERS O2 ON O2.id=P.ownerid
WHERE O1.id=1

这不会像您所描述的那样连接作业所有者和任务所有者,但会 return 每个行,然后您可以在处理结果集时连接它们。

然后根据需要替换 WHERE 子句以获得给定作业编号的任务列表...

WHERE P.jobnumber=1000