给定关系A(a,b,c),B(e,f),C(d,g,h),其中A具有800个元组,B 200和c500。在最坏的情况下给出表达式A * B * C(带有*自然连接):
a) 800 tuples
b) 200 tuples
c) 500 tuples
d) 800*200*500 tuples
e) 800+200+500 tuples
f) Nothing from the above.
我的猜测是800 + 200 + 500,因为没有任何共同的属性?而如果有一个共同的属性呢?
实际上,在没有共同行的表上进行自然联接实际上是您正确地认为的交叉联接。您将获得A * B * C = 800 * 200 * 500 = 80,000,000行。
一旦表中的列相同,就会进行过滤。根据是否存在匹配项以及匹配项的数目,您将获得0到80,000,000行之间的任何值。示例:
毕竟,这都是愚蠢的理论,因为在他们的正确思维中没有人会使用自然连接:-)
我认为您的意思是cross join
而不是natural join
,因为您声明这三个表没有相同的列。
在那种情况下,您将获得三个表的笛卡尔积,即表中所有行的可能组合:这将在结果集中提供800 * 200 * 500行。
[另一方面,如果表之间存在1-1关系(也就是说,在其他表中可以找到每个表中的0或1行),并且将表与inner join
组合在一起,则那么您将获得三个表中确实存在的行的子集:最多为200行(如果三个表之间没有元组可以匹配,则可能为0行)。但是,这似乎不是您的问题所指。
如果您要处理其他类型的关系(一对多,多对多,...),则没有通用答案。它确实取决于关系和数据。