【问题标题】:How to convert JOIN SQL query to relational algebra?如何将 JOIN SQL 查询转换为关系代数?
【发布时间】:2015-04-01 08:57:54
【问题描述】:

您好,我希望能就一个非常烦人的问题获得帮助。 我一直在纠结这个问题,但我真的很难将这个 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

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

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

【问题讨论】:

    标签: mysql relational-algebra


    【解决方案1】:

    请注意,在 Original Post 中,所有连接条件都在同名属性之间。为此,请使用关系代数中的自然连接。 (写为领结符号。http://en.wikipedia.org/wiki/Relational_algebra#Natural_join_.28.E2.8B.88.29)自然连接是可交换的、传递的、幂等的。因此,可以在不需要括号的情况下编写连接的“链”。如果您的架构设计已经被合理地规范化,那么连接链通常就是您想要的。所以关系代数表达式通常比 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)
    

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

      • 啊,这看起来简单多了!那么什么时候适合在多选上使用 join 呢?
      • 我认为加入它是新的符号。 SQL 指定了两种不同的语法方式来表达连接:“显式连接表示法”和“隐式连接表示法”。尽管“隐式连接表示法”在 1992 年被弃用,并且它的使用不被认为是最佳实践,但数据库系统仍然支持它。 wikipedia link
      • 我会否决这个所谓的答案。它用一段更糟糕的 SQL 替换了一段 SQL。我看不到关系代数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      相关资源
      最近更新 更多