联接如何交换和关联?

Jus*_*tin 7 relational-theory relational-algebra

我已经阅读了所有连接是关联和可交换的地方。

所以A join (B join C)应该是一样的(A join C) join B

但我真的很难理解这是怎么回事。假设 A 与 B 有共同的财产,B 与 C 有共同的财产,但 A 和 C 没有共同的财产可以连接。

似乎在这种情况下,在第二个实例中(A join C) join B,当发生连接 A 和 C 的操作时,它会导致一个空集,使得与 B 的连接变得不可能。

而在第一种情况下它会起作用,因为 B 连接 C 会导致预期的连接表具有与 A 连接的属性。

RDF*_*ozz 5

你做了一个错误的假设。

如果有三个公司之间的关系AB之间,以及BC,但没有关系A,并C加盟AC你任何行。它实际上给你m * n行,其中m是 中的行数An是 中的行数B

A JOIN B on (a.id = b.A_id)
  JOIN C on (b.id = c.B_id)
Run Code Online (Sandbox Code Playgroud)

变成,如果我们加入A并且C首先:

A JOIN C on (1 = 1)
  JOIN B on (a.id = b.A_id AND b.id = c.B_id)
Run Code Online (Sandbox Code Playgroud)

注意:大学是 30 多年前 - 希望你从概念上理解,并且可以重写为实际关系代数的正确语法。

如果您有 20 行 in A、30 inB和 40 in C,并且 inB中的每一行都与in中的一行且仅匹配一行A,并且 inC中的每一行都与 中的一行且仅匹配一行B。当你加入A到时B,你会得到 30 行;当您将这 30 行加入到 时C,您将得到 40 行。

如果您第一次加入AC,而没有关系来定义哪些行对是有效的,您将得到每对可能的行- 800 行。当我们加入B到800行之间的连接BA手段,在一排B只能匹配AC包含一个特定的行A一行-还会有那些40个(每个C行)。在这 40 个匹配项中,唯一的实际匹配项是B和之间的连接C也有效的匹配项。而且,我们知道C匹配当前B行的行不能匹配任何其他B行。所以,对于一个B一行,我们可能有 2AC 匹配的行,对于另外 4 个,对于另一个只有 1 个。

也就是说,我们知道每一C行确实匹配一个(并且只有一个)B行,所以匹配的总数将再次出现 40 - 与我们第一次匹配的 40 匹配相同Aand B, or Band C

所以-在条件联接不会告诉你哪行匹配-它真的会告诉你这行匹配。把它拿走,你会得到一个CROSS JOIN- 两个表中行的叉积。