【问题标题】:Maximum number that can be returned by 2 Natural Joins2个自然连接可以返回的最大数量
【发布时间】:2020-06-07 10:11:43
【问题描述】:

给定关系 A(a,b,c), B(e,f), C(d,g,h),其中 A 有 800 个元组,B 200 和 c 500。在最坏的情况下给出表达式 A * B * C (with * natural join) :

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

【问题讨论】:

  • 这个不清楚。 “因为没有任何共同属性”是什么意思?--“没有任何共同属性”如何导致该结果?为什么说你在“猜测”?什么论点有什么问题? PS 请在每个帖子中提出 1 个问题。展示你的研究和你能做什么,并询问你第一次被困在哪里。不要要求我们做你的(家庭)工作。 PSNatural join if no common attributes

标签: sql database computer-science relational-algebra


【解决方案1】:

对没有共同行的表进行自然联接实际上是您正确假设的交叉联接。你会得到 A * B * C = 800 * 200 * 500 = 80,000,000 行。

一旦表格有共同的列,就会进行过滤。根据是否存在匹配项和匹配项的数量,您将获得 0 到 80,000,000 行之间的任何内容。例子:

  • 如果所有表都有一个共同的列,并且每个表的每一行的值都相同,那么您最终会再次得到所有组合。
  • 如果所有表都有一个共同的列,并且它的值在表 A 的所有行中为“A”,在表“B”中的所有行中为“B”,在表 C 中的所有行中为“C”,你最终会没有匹配项,即零行。

毕竟,这都是枯燥的理论,因为没有人会使用自然连接 :-)

【讨论】:

  • 这些表没有共同的(列名)。所以答案与“共同行”无关。自然连接对于没有共同列的表是完全有效的;它退化为交叉连接;是的,结果中的行数是每个连接中行数的乘积。
  • 如果 a) SQL 从一开始就包含它(它只是最近才进入标准,并非所有供应商都支持它),也许更多的人会使用自然连接; b) SQL 没有通过允许对列进行位置和命名访问来破坏自然连接; c) SQL 不允许空值,留下不确定性并怀疑将空值列连接到另一个空值时会发生什么; d) 人们不会一直在 StackOverflow 上发布不正确的答案。
  • @AntC:自然连接的主要问题是您的查询运行良好多年,然后您只需向表中添加一列,突然查询变得不正确,因为其他表恰好有同名列。由于这个原因,自然连接不应该被发明出来。
  • 向表中添加列可以阻止许多运行良好的查询。例如使用 SELECT * FROM ...SELECT 5 FROM ... 的任何内容,其中添加的列位于第 5 列之前。至少在 SQL 之前的 1972 年 IOW 之前“发明”了自然连接。作为规范化技术的“无损连接”意味着自然连接。不要将糟糕的软件控制规则归咎于 Natural join。
  • 呃,没有。 SELECT 5 FROM ... 只选择一个 5。ORDER BY 5(您实际上可能指的是它,无论如何我都不推荐使用它)仍将按查询中的第五列排序。 select * ... order by 5 的组合当然是疯狂的。至于 1972 年:那是我开始使用数据库之前的十多年。据我所知,当我开始时,只有逗号分隔的连接,即交叉连接。我认为没有像自然连接这样的东西会自动连接到可能是所需的列上。所以,我认为你可能错了。
【解决方案2】:

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

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

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

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

【讨论】:

  • 自然连接对于没有共同列的表是完全有效的;它退化为交叉连接。所以这个例子是both一个natural join和一个cross join
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
相关资源
最近更新 更多