【问题标题】:Relational Algebra: Natural join with NULL value关系代数:具有 NULL 值的自然连接
【发布时间】:2016-10-03 21:08:17
【问题描述】:

表 1

Customer  id  city 
John       1   LA
Nancy      2   NULL

表 2

Customer  $ in the pocket 
John       20
Nancy      30

我想知道如果Table 1 自然加入Table 2 会发生什么?我的猜测是结果将是 4 个属性,并且 John 和 Nancy 都会出现。

但我的朋友告诉我只有 John 会出现,Nancy 不会出现,因为有一个 null 值。

【问题讨论】:

  • 加入发生在两个属性上,如果你使用客户加入(这将是默认的)那么你的朋友就错了:)
  • 要弄清楚,只需将 NATURAL JOIN 重写为常规 INNER EQUIJOIN,使用与 NATURAL JOIN 相同的规则。鉴于您示例中的关系,这将是 Customer 属性上的等值连接。 (city 属性中的 NULL 值无关紧要,因为其他关系没有名为 city 的属性。) NATURAL JOIN 将使用具有相同名称的所有属性。如果第二个关系也有一个名为 city 的属性,那将与 Customercity 属性上的 INNER EQUIJOIN 相同。
  • 对于自然加入,我们是否只有在我们匹配了共同属性时才加入,(在这种情况下,是客户字段)?
  • @spencer7593,所以如果common属性中不包含null,那么就可以了?
  • 我不会说“自然加入”就可以了。在学术界之外,我们从不使用 NATURAL JOIN。 (我们只需要有人在 table2 中添加一个名为 city 的列,而我们正在运行的查询会被破坏。)当我遇到一个 NATURAL JOIN 时,为了弄清楚它到底在做什么,我需要看看遍历两个表中的所有列,并找到所有匹配项。当我这样做的时候,我悄悄地诅咒那个一直在拯救自己的开发者,输入“NATURAL”而不是“ON a.customer = b.customer”,这样我就可以多花二十倍的时间来弄清楚。

标签: relational-database relational-algebra natural-join


【解决方案1】:

在上面的情况下,你的朋友错了,你是对的!

让我们看一个情况:

表“客户”

Id Name   AccNo
1  John    44
2  Nancy  NULL 

表“帐户”

AccNo $_in_Pocket
44       20
45       30

在这里,通过自然连接,我们将获得 John 的所有属性,但结果中会缺少 Nancy。

【讨论】:

  • 您不必使用 HTML 标记和实体来格式化您的答案,而是使用适当的 Stackoverflow 答案格式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
相关资源
最近更新 更多