sql—2个自然联接可以返回的最大数目

u0sqgete  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(278)

给定关系a(a,b,c),b(e,f),c(d,g,h),其中a有800个元组,b200和c500。在最坏的情况下给出表达式abc(带*自然连接):

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,因为没有任何共同的属性?如果有一个共同的属性呢?

tct7dpnv

tct7dpnv1#

没有共同行的表上的自然连接实际上是交叉连接,正如您正确地假设的那样。你会得到abc=800200500=80000000行。
一旦这些表有公共列,就会进行筛选。根据是否有匹配项以及有多少匹配项,可以得到0到80000000行之间的任何值。示例:
如果所有表都有一个共同的列,并且每个表中的每一行的值都相同,那么您将再次得到所有的组合。
如果所有表都有一个公共列,并且其值在表a的所有行中为“a”,在表“b”的所有行中为“b”,在表c的所有行中为“c”,则最终没有匹配项,即零行。
毕竟,这一切都是枯燥的理论,因为在他们正常的头脑中没有人会使用自然连接:-)

exdqitrt

exdqitrt2#

我想你是说 cross join 而不是 natural join ,因为您说过这三个表没有共同的列。
在这种情况下,您将得到三个表的笛卡尔积,即表中所有行的可能组合:这将在结果集中得到800200500行。
另一方面,如果表之间存在1-1关系(即,在其他表中可以找到每个表中的0或1行),并且您将这些表与 inner join s、 然后您将得到三个表中确实存在的行的子集:最多200行(如果三个表中没有匹配的元组,则可能是0行)。然而,这并不是你的问题所指的。
如果您处理的是其他类型的关系(一对多,多对多,…),那么就没有通用的答案。它确实取决于关系和数据。

相关问题