【问题标题】:Relational Algebra equivalent of SQL "NOT IN"SQL“NOT IN”的关系代数等价物
【发布时间】:2012-09-22 07:27:50
【问题描述】:

是否存在与 SQL 表达式 NOT IN 等效的关系代数?

例如,如果我有关系:

A1  |  A2
----------
x   |  y
a   |  b
y   |  x

我想删除 A1 在 A2 中的关系中的所有元组。在 SQL 中我可能会查询:

SELECT
    *
FROM
    R
WHERE
    R.A1 NOT IN
        (
        SELECT
            A2
        FROM
            R
        )
/

真正困扰我的是如何在关系代数选择运算符中进行子查询,这可能吗?:

σ这里有一些子查询R

【问题讨论】:

    标签: sql relational-algebra


    【解决方案1】:

    在关系代数中,您可以使用笛卡尔积来做到这一点。比如:

    R - ρa1,a2a11,a21A11 = A22a11,a21 sub>(R) x ρa12, a22(R))))

    • 重命名 R 的列,f.e.从 a1 到 a11(左手)和 a12(右手)
    • 用重命名的列取 R 的叉积
    • 选择 a11 等于 a22 的行
    • 投影出 a12 和 a22 并保留 a11 和 a21
    • 重命名为 a1 和 a2

    这将为您提供匹配的行。从 R 中减去它以找到不匹配的行。

    【讨论】:

    • 您能否解释一下这是如何工作的……也许可以扩大省略号。我无法理解叉积的结果,R 中只有两个字段,那么如何将 pi 运算符与两个以上的参数放在上面?
    • 如果只有两列,您可以省略省略号。答案还使用了应该使用 RHO 的 PI,不确定是在编辑中还是在原始答案中。
    【解决方案2】:

    开头的问题让我们产生了错误的想法。应该是:

    是否存在与 SQL 表达式 R WHERE ... [NOT] IN S 等效的关系代数?

    (也就是说,答案是两个关系之间的某种操作,不是某种过滤器。)

    答案是肯定的,它是(自然)JOIN 又名领结运算符

    要了解原因,让我们先整理一下给出的 SQL 解决方案。如图所示,它正在寻找属性A1 NOT IN 与单个属性A2 的关系。这确实是属性名称的不匹配。 SQL 还允许在 where 条件中使用 NOT。这条 SQL 让逻辑结构更清晰:

    SELECT * FROM R
    WHERE NOT (A1 IN (SELECT A2 AS A1 FROM R) )
    

    现在我们可以看到投影和重命名。 (根据第一个答案,我们可以将周围的NOT 实现为 set MINUS。)所以等效的 RA 是:

    R - (R ⋈ ρA1⁄A2A2(R)))

    出于兴趣,教程 D 是:

    R MINUS (R JOIN (R {A2} RENAME A2 AS A1))
    

    在提出问题的方式上,SQL 思维存在宿醉。 SQL 的WHERE 强制您进入行级“模式”。这违反了 Codd 的规则 7,要求操作符是一次设置。

    一般来说,SQL 的 WHERE 和 RA 的 σ 及其行级过滤器可以更简洁地实现为(自然)JOIN 和一次设置逻辑。 (例如,这就是 Date 和 Darwen 在他们的 A 代数中所做的。)

    【讨论】:

      【解决方案3】:

      直接回答一个更一般的问题:

      SELECT
          *
      FROM
          R
      WHERE
          R.A1 NOT IN
              (
              SELECT
                  A2
              FROM
                  S
              );
      

      答案是:

      R-R "bowtie" [R.A1=S.A2] ("pi" [A2] S )
      

      【讨论】:

        猜你喜欢
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-27
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 2017-08-16
        • 1970-01-01
        相关资源
        最近更新 更多