2 个自然连接可以返回的最大数量



给定关系A(a,b,c(,B(e,f(,C(d,g,h(,其中A有800个元组,B 200和c 500。在最坏的情况下给出表达式 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 行的任何内容。例子:

  • 如果所有表都有一列共同的列,并且每个表中的每一行的值都相同,则最终会再次得到所有组合。
  • 如果所有表都有一列共同点,并且表A中所有行的值为"A",表"B"中所有行
  • 的值为"B",表C中所有行的值为"C",则最终没有匹配项,即零行。

毕竟,这一切都是沉闷的理论,因为没有人会使用自然连接:-(

我认为你的意思是cross join而不是natural join,因为你说这三个表没有共同的列。

在这种情况下,您将获得三个表的笛卡尔乘积,即表中所有可能的行组合:这将在结果集中提供 800 * 200 * 500 行。

另一方面,如果表之间存在 1-1 个关系(即,可以在其他表中找到每个表中的 0 或 1 行(,并且您将用inner joins 组合表,那么您将获得三个表中确实存在的行子集:最多 200 行(可能还有 0 行, 如果三个表之间没有元组可以匹配(。然而,这不是你的问题所指的。

如果您正在处理其他类型的关系(一对多,多对多,...(,那么没有通用的答案。它确实取决于关系和数据。

关系 A 包含 800 个不同的元组,关系 B 包含 200 个不同的元组,关系 C 包含 500 个不同的元组。在自然连接中,它将返回 B 的 200 个不同值与 A 和 C 的值匹配的记录,因此,最大元组数将为 200

最新更新