2009-01-13 56 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路连接没有任何问题,它们确实发生在现实世界中。