Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL的关系代数等价物;不在「;_Sql_Relational Algebra - Fatal编程技术网

SQL的关系代数等价物;不在「;

SQL的关系代数等价物;不在「;,sql,relational-algebra,Sql,Relational Algebra,在中是否存在SQL表达式的关系代数等价物 例如,如果我有以下关系: A1 | A2 ---------- x | y a | b y | x 我想删除关系中A1在A2中的所有元组。在SQL中,我可能会查询: SELECT * FROM R WHERE R.A1 NOT IN ( SELECT A2 FROM R ) / 真正困扰我的是如

在中是否存在SQL表达式的关系代数等价物

例如,如果我有以下关系:

A1  |  A2
----------
x   |  y
a   |  b
y   |  x
我想删除关系中A1在A2中的所有元组。在SQL中,我可能会查询:

SELECT
    *
FROM
    R
WHERE
    R.A1 NOT IN
        (
        SELECT
            A2
        FROM
            R
        )
/
真正困扰我的是如何在关系代数选择运算符中进行子查询,这可能吗


σ在关系代数中,您可以使用carthesian乘积来实现某些子查询。比如:

R-ρa1,a2(πa11,a21(σa11=A22)(ρa11,a21(R)xρa12,A22(R)))

  • 将R、f.e.列从a1重命名为a11(左侧)和a12(右侧)
  • 取R与重命名列的叉积
  • 选择a11等于a22的行
  • 突出a12和a22,保留a11和a21
  • 重命名为a1和a2

这将为您提供匹配的行。从R中减去这个,找出不匹配的行。

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

是否存在SQL表达式
R的关系代数等价物,其中。。。S中的[非]

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

答案是肯定的,它是(自然的)
JOIN
aka领结操作符

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

SELECT * FROM R
WHERE NOT (A1 IN (SELECT A2 AS A1 FROM R) )
现在我们可以看到投影和重命名。(根据第一个答案,周围的
不是
我们可以实现为set-减号。)因此等效的RA为:

R-(R)⋈ ρ
A1/A2
(π
A2
(R))

出于兴趣,教程D为:

R MINUS (R JOIN (R {A2} RENAME A2 AS A1))
在提出问题的方式中,存在着SQL思维的后遗症。SQL的
WHERE
强制您进入行级“模式”。这是contra Codd的规则7,要求每次设置运算符


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

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

SELECT
    *
FROM
    R
WHERE
    R.A1 NOT IN
        (
        SELECT
            A2
        FROM
            S
        );
答案是:

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

你能解释一下这是怎么回事吗。。。也许扩大省略号点。我很难理解叉积的结果,在R中只有两个字段,那么如何将pi运算符与两个以上的参数放在一起?如果只有两列,可以省略省略号点。答案在应该使用RHO的地方也使用了PI,不确定这是在编辑中还是在原始答案中。