如何将 JOIN SQL 查询转换为关系代数?
How to convert JOIN SQL query to 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
我对关系代数的基础知识没问题,但我很难了解如何用条件表示多个连接。
非常感谢任何建议,谢谢:)
也许你需要一些类似的东西:
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
请注意,在原始 Post 中,所有连接条件都在同名属性之间。为此,请使用关系代数中的自然连接。 (写成蝴蝶结符号。http://en.wikipedia.org/wiki/Relational_algebra#Natural_join_.28.E2.8B.88.29)Natural Join 是可交换的、可传递的、幂等的。所以 'chains' of Joins 可以写成不需要括号。如果您的架构设计已合理规范化,那么连接链通常就是您想要的。所以关系代数表达式通常比 SQL FROM/WHERE 子句更清晰。
Ollie 没有给出模式,所以我们不知道关系中是否还有其他同名属性。我假设不会。
对于 SQL 的 AS,使用关系代数重命名(rho 运算符)。请注意,在关系代数中,不需要在属性名称前加上它们的关系名称。事实上,这是完全错误的,正是因为 Natural Join 按属性名称匹配的方式。
解决方案是:
rho <STF_FirstNames/`Doctor First Names`, STF_LastName/`Doctor Last Name`, ... >
(staff bowtie doctor bowtie patient bowtie patient_makes_appointment)
您好,我希望得到帮助解决一个非常烦人的问题。 我一直在围绕这个问题转圈子,但我真的很难将这个 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
我对关系代数的基础知识没问题,但我很难了解如何用条件表示多个连接。
非常感谢任何建议,谢谢:)
也许你需要一些类似的东西:
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
请注意,在原始 Post 中,所有连接条件都在同名属性之间。为此,请使用关系代数中的自然连接。 (写成蝴蝶结符号。http://en.wikipedia.org/wiki/Relational_algebra#Natural_join_.28.E2.8B.88.29)Natural Join 是可交换的、可传递的、幂等的。所以 'chains' of Joins 可以写成不需要括号。如果您的架构设计已合理规范化,那么连接链通常就是您想要的。所以关系代数表达式通常比 SQL FROM/WHERE 子句更清晰。
Ollie 没有给出模式,所以我们不知道关系中是否还有其他同名属性。我假设不会。
对于 SQL 的 AS,使用关系代数重命名(rho 运算符)。请注意,在关系代数中,不需要在属性名称前加上它们的关系名称。事实上,这是完全错误的,正是因为 Natural Join 按属性名称匹配的方式。
解决方案是:
rho <STF_FirstNames/`Doctor First Names`, STF_LastName/`Doctor Last Name`, ... >
(staff bowtie doctor bowtie patient bowtie patient_makes_appointment)