【问题标题】:Natural join of table (A) with itself表 (A) 与自身的自然连接
【发布时间】:2015-03-21 02:59:04
【问题描述】:

我在一次采访中遇到了这个问题,我一直在想我所做的是否正确。假设我有一个具有以下属性的表“A”:

R   S    T
-----------
a1  b1   c1
a1  b2   c2
a1  b3   c3
a4  b4   c4

假设我需要计算给定 B = {[(projection)R,S (A) NATURAL JOIN (projection) S,T (A) ] NATURAL JOIN (projection)R,T (A) 的关系代数)}

结果会怎样?

这是我尝试过的:

-We know (A) NATURAL JOIN (A) = A
-I did the first set of join within the square bracket. Since we had  attribute 'S' in common I just yielded the result to be a table of (R S T) with the same 4 rows of tuples.
-Finally, I joined (R S T) with the second set of join where attributes 'R' and 'T' are common which I assumed will yield R S T again with 4 rows of tuples.

意思是,按照我的做法,我最终得到了 B = A。

我根本没有考虑元组,我只是根据两个投影之间的共同属性进行了自然连接。

我知道这很愚蠢..但我试图在 MySQL 中执行它,由于某种原因,当我尝试执行这样的查询时遇到错误:

从 dbt2.relationalallgebra 中选择 A、B 作为 r1 自然连接(从 dbt2.relationalallgebra 中选择 B、C 作为 r2);我收到一个错误,说每个派生表都必须有自己的别名!

请帮助我阐明自然联接如何在同一张表上工作。

提前感谢您的帮助。

【问题讨论】:

    标签: mysql join relational-algebra natural-join


    【解决方案1】:

    你所做的是正确的。你得到 B = A 是正确的——考虑到 A 的内容。

    这是一个关于数据中值之间的函数依赖关系的问题。 (因此,如果数据不同,您可能不会得到 B = A。)

    对于属性 S 和 T,每个元组中都有不同的值。 IoW 给定 S(或 T)的值,您知道它来自哪一行,因此您知道该元组中其他两个属性的值。函数依赖是 S -> R, T; T -> R, S.(你可能会说 S 或 T 是 A 的每个键。)

    您给每个投影中的属性对至少包含一个键,因此唯一地确定连接哪个“缺失”属性。根据希思定理,您会看到无损连接分解。 http://en.wikipedia.org/wiki/Functional_dependency

    【讨论】:

      【解决方案2】:

      自然连接是在所有具有相同名称的列上连接两个表(或子查询)的简写。

      表与自身的自然连接可能会产生多种后果。最常见的是表本身——如果没有任何值是 NULL 并且行是唯一的。如果每一行在某个列中都有一个NULL 值,那么natural join 将根本不返回任何行。如果行重复,则可能会出现多行。

      我不建议您使用 natural join。对基础表结构的微小更改可能会破坏查询。

      【讨论】:

      • 这是一个关于关系代数的问题,而不是 SQL。您提供了一个很好的理由说明为什么 SQL 的 NULL 是可憎的——这就是它没有出现在 RA 中的原因。 OP 非常正确地指出 (A) NATURAL JOIN (A) = A。SQL 不一定是这种情况(因为 NULL 的问题)。我不建议使用 SQL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      相关资源
      最近更新 更多