table (A) 与自身的自然连接

Natural join of table (A) with itself

我在面试中遇到了这个问题,我一直在想我的做法是否正确。假设我有一个 table '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 计算关系代数(一)}

结果会是什么?

这是我试过的:

-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 中执行它,由于某种原因,当我尝试执行这样的查询时出现错误:

select A,B from dbt2.relationalalgebra as r1 NATURAL JOIN (select B, C from dbt2.relationalalgebra as r2);我收到一条错误消息,说每个派生的 table 都必须有自己的别名!

请帮助我阐明自然连接如何在相同的 table 上工作。

在此先感谢您的帮助。

自然联接是 shorthand,用于联接所有同名列上的两个 table(或子查询)。

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

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

你做的是对的。鉴于 A 的内容,您获得 B = A 是正确的。

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

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

您给出的投影中的每对属性都至少包含一个键,因此可以唯一确定连接哪个 'missing' 属性。根据希思定理,您看到的是无损连接分解。 http://en.wikipedia.org/wiki/Functional_dependency