表(A)与其自身的自然连接

时间:2015-03-21 02:59:04

标签: mysql join relational-algebra natural-join

我在接受采访时遇到了这个问题,我一直在想我的所作所为是对的。我们说我有一张桌子' A'具有以下属性:

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

并且假设我需要计算给定B = {[(投影)R,S(A)自然连接(投影)S,T(A)]自然连接(投影)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.relationalalgebra中选择A,B作为r1 NATURAL JOIN(从dbt2.relationalalgebra中选择B,C为r2);我收到一个错误,说每个派生表必须有自己的别名!

请帮助我澄清自然联接如何在同一张桌子上工作。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

你所做的是正确的。并且你获得B = A是正确的 - 给出A的内容。

这是关于数据中值之间的功能依赖性的问题。 (如果数据不同,你可能得不到B = A.)

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

您给出的投影中的属性对包括至少一个键,因此唯一地确定哪个'缺失'属性加入。根据Heath的定理,您正在看到无损连接分解。 http://en.wikipedia.org/wiki/Functional_dependency