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
如何在同一结果集中查询多个多对多关系?
我有两个 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