簡體   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