关系代数相当于SQL"NOT IN"

jsj*_*jsj 5 sql relational-algebra

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

例如,如果我有关系:

A1  |  A2
----------
x   |  y
a   |  b
y   |  x
Run Code Online (Sandbox Code Playgroud)

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

SELECT
    *
FROM
    R
WHERE
    R.A1 NOT IN
        (
        SELECT
            A2
        FROM
            R
        )
/
Run Code Online (Sandbox Code Playgroud)

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

?这里有一些子查询 R.

And*_*mar 6

在关系代数中,您可以使用carthesian产品来完成此操作.就像是:

R - ?a1,a2(?a11,a21(?A11 = A22(?a11,a21(R)x?a12,a22(R))))

  • 重命名R,fe的列从a1到a11(左手)和a12(右手)
  • 使用重命名的列来获取R的叉积
  • 选择a11等于a22的行
  • 预测a12和a22并保持a11和a21
  • 重命名为a1和a2

这为您提供了匹配的行.从R中减去此值以查找不匹配的行.


Ant*_*ntC 5

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n
SELECT * FROM R\nWHERE NOT (A1 IN (SELECT A2 AS A1 FROM R) )\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

R - (R \xe2\x8b\x88 \xcf\x81A1\xe2\x81\x84A2 (\xcf\x80A2(R)))

\n\n

为了感兴趣,教程 D 是:

\n\n
R MINUS (R JOIN (R {A2} RENAME A2 AS A1))\n
Run Code Online (Sandbox Code Playgroud)\n\n

从问题的提出方式来看,存在 SQL 思维的后遗症。SQLWHERE强制您进入行级“模式”。这与 Codd 规则 7 的要求相反,要求设置一次操作符。

\n\n

一般来说,带有行级过滤器的SQLWHERE和 RA可以通过一次设置逻辑更简洁地实现为(自然)。(例如,这就是 Date 和 Darwen 在他们的A代数中所做的事情。)\xcf\x83JOIN

\n