如何将JOIN SQL查询转换为关系代数?

时间:2015-02-02 11:59:55

标签: mysql relational-algebra

您好我希望得到一个非常恼人的问题的帮助。 我已经围绕这个问题进行了讨论,但我真的很难将这个SQL查询转换为它的关系代数等价。

查询:

SELECT
staff.STF_FirstNames AS `Doctor First Name`,
staff.STF_LastName AS `Doctor Last Name`,

patient.PAT_FirstNames AS `Patient First Name`,
patient.PAT_LastName AS `Patient Last Name`,

patient_makes_appointment.APP_DateTime AS `Appointment Time`

FROM staff
JOIN doctor                     ON staff.STF_ID = doctor.STF_ID
JOIN patient                    ON doctor.DOC_ID = patient.DOC_ID
JOIN patient_makes_appointment  ON patient.PAT_ID = patient_makes_appointment.PAT_ID

我对关系代数的基础知识很满意,但我很难看到如何用条件表示多个连接。

非常感谢任何建议,谢谢:)

2 个答案:

答案 0 :(得分:0)

也许你需要一些看起来像:

SELECT
  staff.STF_FirstNames AS `Doctor First Name`,
  staff.STF_LastName AS `Doctor Last Name`,

  patient.PAT_FirstNames AS `Patient First Name`,
  patient.PAT_LastName AS `Patient Last Name`,

  patient_makes_appointment.APP_DateTime AS `Appointment Time`

FROM staff, doctor, patient, patient_makes_appointment
WHERE staff.STF_ID = doctor.STF_ID 
  AND doctor.DOC_ID = patient.DOC_ID
  AND patient.PAT_ID = patient_makes_appointment.PAT_ID

答案 1 :(得分:0)

请注意,在原始帖子中,所有连接条件都在同名的属性之间。为此,使用关系代数中的自然连接。 (写作领结符号。http://en.wikipedia.org/wiki/Relational_algebra#Natural_join_.28.E2.8B.88.29)自然连接是可交换的,传递的,幂等的。因此,连接的'链'可以在不需要parens的情况下编写。如果您的架构设计已经合理地规范化,那么联接链通常是您想要的。因此,关系代数表达式通常比SQL FROM / WHERE子句更清晰。

Ollie没有给出架构,因此我们不知道关系中是否存在同名的其他属性。我不会假设。

对于SQL的AS,请使用Relational Algebra Rename(rho运算符)。请注意,在Relational Algebra中,不需要为属性名称添加其关系名称前缀。事实上,这是完全错误的,完全是因为自然连接按属性名称匹配的方式。

解决方案是:

rho <STF_FirstNames/`Doctor First Names`, STF_LastName/`Doctor Last Name`, ... >
(staff bowtie doctor bowtie patient bowtie patient_makes_appointment)