Relational-Theory

聯接如何進行交換和關聯?

  • July 11, 2018

我已經閱讀了所有連接是關聯和交換的地方。

所以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 連接的屬性。

你做了一個錯誤的假設。

如果三是 and 之間的關係,and 之間的關係Aand但and之間沒有關係,則加入and不會你任何行。它實際上為您提供m * n行,其中m是 中的行數,n是 中的行數。B``B``C``A``C``A``C``A``B

A JOIN B on (a.id = b.A_id)
 JOIN C on (b.id = c.B_id)

變成,如果我們加入A並且C首先:

A JOIN C on (1 = 1)
 JOIN B on (a.id = b.A_id AND b.id = c.B_id)

注意:大學是 30 多年前的事了——希望你從概念上理解,並且可以重寫為實際關係代數的正確語法。

如果您有 20 行 in A、 30 inB和 40 in C,並且 in 的每一行B匹配 1 行且僅匹配 1 行A,並且 in 的每一行C匹配 1 行且僅匹配 1 行B。當您加入AB,您將獲得 30 行;當您將這 30 行加入 時C,您將獲得 40 行。

如果您第一次加入AC與定義哪些行對是有效的沒有關係,您將獲得每對可能的行- 800 行。當我們加入800 行時,和B之間的連接意味著其中的一行只能匹配包含一個特定行的行 - 其中將有 40 個(每行一個)。在這 40 個中,唯一的實際匹配是 和 之間的連接也是有效的。而且,我們知道匹配目前行的行不能匹配任何其他行。所以,對於一排,我們可能有 2B``A``B``AC``A``C``B``C``C``B``B``B``AC匹配的行,另外 4 行,再匹配 1 行。

也就是說,我們知道每一C行都匹配一個(並且只有一個)B行,所以匹配的總數將再次達到 40 - 與我們第一次匹配的 40 個匹配一樣Aand B, or Band C

所以 - 連接的條件並沒有告訴你哪些行匹配 - 它真的告訴你哪些行不**匹配。把它拿走,你就得到了- 兩個表中行的叉積。CROSS JOIN

引用自:https://dba.stackexchange.com/questions/190662