6

是否存在与 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

4

3 回答 3

6

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

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

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

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

于 2012-09-22T07:33:01.477 回答
3
于 2013-10-02T22:29:06.980 回答
1

A direct answer to a more general question:

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

The answer is:

R-R "bowtie" [R.A1=S.A2] ("pi" [A2] S )
于 2019-11-24T19:40:38.737 回答