Я новичок в реляционной алгебре, и для моего задания мне нужно создать две. Я написал о проблеме, с которой столкнулся в 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;


Я думаю, вы неправильно понимаете проблему. В реальном мире вы никогда не захотите создать ситуацию, в которой у вас будет 6-стороннее соединение.
Кажется, что у вас здесь инциденты и люди. У людей есть роли. Должно быть, может быть, три таблицы, инциденты, роли и люди. То, как вы дважды присоединитесь к Person, будет беспорядком.
Думаю, вам стоит сесть и почитать о нормализации базы данных.
http://en.wikipedia.org/wiki/Database_normalization
Причина, по которой я присоединялся к таблице людей несколько раз, заключается в том, что я использую наследование базы данных, где общие значения хранятся в таблице людей, а все особенности типов людей хранятся в их собственных таблицах.
@rabble: в реальном мире происходит более 6 соединений, поэтому я бы назвал это нормой (так что я подозреваю, что у вас мало опыта в реальном мире). Вы также упоминаете нормализацию базы данных (что хорошо), но не замечаете, что она имеет тенденцию увеличивать количество соединений.
Нормализованные базы данных не масштабируются. Я создаю fireeagle.com и odeo.com ... При загрузке нельзя присоединяться, это просто реальность. Вот почему сейчас так много интереса к альтернативам RDMS ...
Те левые соединения, которые вы делаете, называются в реляционной алгебре тета-соединениями, иногда более конкретно, как равные соединения. Вы захотите использовать символ, похожий на галстук-бабочку, и написать под ним «StudentID = PersonID» (для второго соединения в вашем примере). Я не умею рисовать причудливые символы, но у http://en.wikipedia.org/wiki/Relational_algebra#.CE.B8-join_and_equijoin есть несколько примеров.
Кроме того, нет ничего плохого в 6-стороннем объединении, и оно действительно произойдет в реальном мире.
У меня создалось впечатление, что «внутреннее соединение» было «равносоединением».
Мне кажется, с вашим дизайном базы данных действительно неудобно работать