1

我在一次采访中遇到了这个问题,我一直在想我所做的是否正确。假设我有一个具有以下属性的表“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);我收到一个错误,说每个派生表都必须有自己的别名!

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

提前感谢您的帮助。

4

2 回答 2

0

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

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

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

于 2015-03-21T03:02:08.570 回答
0

你所做的是正确的。你得到 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

于 2015-04-09T10:10:04.070 回答