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
我在面试中遇到了这个问题,我一直在想我的做法是否正确。假设我有一个 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