繁体   English   中英

SQL中的多个多对多关系

[英]Multiple many-to-many relationships in SQL

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

我有两个表,通常我总是向左联接以获取标准结果集:

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

任务编号是一个GUID,与作业编号无关,但是永远不会与多个作业相关。

我在工作号上留下了tblTASKS,因为并非所有项目都将有任务(至今)

但是然后我还有一个所有者表,该表定义了1-n个用户,这些用户既拥有整个任务,又拥有各个任务(或两者兼有)。 每个用户可以拥有多个作业和/或任务。 数据库规范的原始设计是使用一个表。

tblOWNERS-

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

所有者类型1表示用户拥有整个工作。 所有者类型2表示用户拥有任务中的任务。

我要构造两个查询:

1)与所有关联的任务所有者一起返回该作业,并与所有关联的任务所有者一起加入该任务的所有任务。

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

2)给定所有者ID,返回与它们关联的所有作业和/或任务。

困扰我的是同一张表中的多对多。 我能做到吗? 如果是这样,我是否正在寻找某种UNION或INTERSECT(我要学习什么)? 或者,如果不是这样的话,那么这种关系的最佳方案是什么呢?

TIA!

通常,您需要将外键放在ERD的多个末端,因此在这种情况下,您可能在表'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

这不会像您所描述的那样串联工作所有者和任务所有者,但是将为每个返回一行,然后您可以在处理结果集的同时串联它们。

然后,根据需要替换WHERE子句,以获取给定Job编号的任务列表...

WHERE P.jobnumber=1000

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM