2009-01-13 58 views
0

我是新來的關係代數和我的任務,我必須創建兩個。我已經寫出了SQL中遇到的問題,但我不確定如何在關係代數中表示這種聯接。任何幫助/指針將不勝感激。我如何表示我在關係代數中的加入?

SELECT ps.FirstName AS StudentFirstName, ps.LastName AS StudentLastName, pst.FirstName AS StaffFirstName , pst.LastName AS StaffLastName, pg.FirstName AS GuardianFirstName, pg.LastName AS GuadianLastName, i.DateTimeReported, i.NatureOfIllness 
FROM Incident i 
JOIN Student s USING (StudentID) 
JOIN Person ps ON (s.StudentID = ps.PersonID) 
JOIN Staff st USING (StaffID) 
JOIN Person pst ON (st.StaffID = pst.PersonID) 
JOIN Guardian g USING (GuardianID) 
JOIN Person pg ON (g.GuardianID = pg.PersonID) 
WHERE i.DecisionMade IS NULL; 
+0

我有一種感覺,你的數據庫設計是非常尷尬的與 – 2009-01-13 00:46:38

回答

-4

我想你是以錯誤的方式去解決問題的。在現實世界中,你永遠不想創造一種6路加入的情況。

看起來你在這裏似乎是事件和人。人們有角色。應該有三個表格,事件,角色和人員。你兩次加入人的方式將會變得一團糟。

我想你應該坐下來閱讀有關數據庫規範化的內容。

http://en.wikipedia.org/wiki/Database_normalization

+0

工作我已經多次加入人表的原因是因爲我使用的數據庫繼承,其中普通值存儲在人員表和所有人類型細節存儲在他們自己的表格中。 – Malachi 2009-01-13 10:31:15

+1

@rabble:在現實世界中,如此頻繁地發生超過6次連接發生,我將其稱爲常態(所以我會懷疑你沒有真實世界的經驗)。你還提到數據庫規範化(這是一件好事),但沒有注意到它往往會增加連接。 – 2009-01-25 00:08:02

2

那些留在加入你正在做的關係代數被稱爲θ-加入,有時更具體明確爲等值連接。您需要使用看起來像領結的符號,並在其下面寫上「StudentID = PersonID」(在您的示例中爲第二次加入)。我不能做花哨的符號,但http://en.wikipedia.org/wiki/Relational_algebra#.CE.B8-join_and_equijoin有一些例子。

此外,6路連接沒有任何問題,它們確實發生在現實世界中。