聯接如何進行交換和關聯?
我已經閱讀了所有連接是關聯和交換的地方。
所以
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 之間的關係
A
and但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 inC
,並且 in 的每一行B
匹配 1 行且僅匹配 1 行A
,並且 in 的每一行C
匹配 1 行且僅匹配 1 行B
。當您加入A
時B
,您將獲得 30 行;當您將這 30 行加入 時C
,您將獲得 40 行。如果您第一次加入
A
,C
與定義哪些行對是有效的沒有關係,您將獲得每對可能的行- 800 行。當我們加入800 行時,和B
之間的連接意味著其中的一行只能匹配包含一個特定行的行 - 其中將有 40 個(每行一個)。在這 40 個中,唯一的實際匹配是 和 之間的連接也是有效的。而且,我們知道匹配目前行的行不能匹配任何其他行。所以,對於一排,我們可能有 2B``A``B``AC``A``C``B``C``C``B``B``B``AC
匹配的行,另外 4 行,再匹配 1 行。也就是說,我們知道每一
C
行都匹配一個(並且只有一個)B
行,所以匹配的總數將再次達到 40 - 與我們第一次匹配的 40 個匹配一樣A
andB
, orB
andC
。所以 - 連接的條件並沒有告訴你哪些行匹配 - 它真的告訴你哪些行不**匹配。把它拿走,你就得到了- 兩個表中行的叉積。
CROSS JOIN