2015-12-27 47 views
2

我讀的書SQL反模式,並試圖瞭解構建「樹」與自我指涉表其例子如一張桌子與外部連接:這是如何工作的?

      Comments 
------------------------------------------------------------------- 
    comment_id | parent_id | author |  comment 
------------------------------------------------------------------- 
     1   NULL  Fran  What's the cause of this bug? 
     2   1  Ollie  I think it's a null pointer. 
     3   2  Fran  No, I checked for that. 
     4   1  Kukla  We need to check for invalid input. 
     5   4  Ollie  Yes, that's a bug. 
     6   4  Fran  Yes, please add a check. 
     7   6  Kukla  That fixed it. 

所以這本書

你說可以retrive評論和使用 相對簡單的查詢,它的直接孩子:

SELECT c1.*, c2.* 
FROM Comments c1 LEFT OUTER JOIN Comments c2 
    ON c2.parent_id = c1.comment_id 

我想了解這是如何工作的。我一直明白左外方式表之間的連接t1t2的是,你需要從t1爲行中的所有行,其中ON條款不滿意你NULL填寫從第二個表中的列。在這種情況下,只有一個表,但我可以想象查詢發生在兩個表中,其中第二個表是第一個表的副本。不過,我不明白如何查詢返回

樹的兩個級別。

結果表格究竟是什麼,你可以引導我瞭解它是如何產生的邏輯?

回答

2

所得表將是以下:

      Comments 
------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
    c1.comment_id | c1.parent_id | c1.author | c1.comment       | c2.comment_id | c2.parent_id | c2.author | c2.comment       | 
------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
     1    NULL  Fran   What's the cause of this bug?    2    1   Ollie  I think it's a null pointer. 
     1    NULL  Fran   What's the cause of this bug?    4    1   Kukla  We need to check for invalid input. 
     2    1   Ollie  I think it's a null pointer.    3    2   Fran   No, I checked for that.              
     3    2   Fran   No, I checked for that.     NULL   NULL  NULL   NULL         
     4    1   Kukla  We need to check for invalid input.  5    4   Ollie  Yes, that's a bug.     
     4    1   Kukla  We need to check for invalid input.  6    4   Fran   Yes, please add a check.   
     5    4   Ollie  Yes, that's a bug.      NULL   NULL  NULL   NULL         
     6    4   Fran   Yes, please add a check.     7    6   Kukla  That fixed it. 
     7    6   Kukla  That fixed it.       NULL   NULL  NULL   NULL 

ON子句,我們有c2.parent_id = c1.comment_id。這將意味着「右」表(c2)的parent.id將加入「左」表(c1)的comment_id

該表通過將每行與其子註釋映射到自身。右側的結果(c2)將是c1條目的所有子女,這些條目對每個孩子都是重複的。由於我們正在進行左連接,所以沒有子節點的行只會在c2列上返回NULL

2

你的理解是正確的 - 是的,你應該把它看作是一個左連接到它自身的副本。它代表一層深度的原因是因爲每一行代表一個評論,但它可能有一個到父註釋(parent_id)的鏈接,這意味着您可以將此錶轉換爲樹來幫助直觀地理解它。因爲你還沒有加入,所以你正在採取每一個評論,並將其與所有的孩子相匹配。如果它沒有任何子項,則子列將爲空(左連接的後果)。如果你畫出一棵樹,你可以帶走每個節點,並將它加上所有直接的孩子,你會看到這是你的結果集。如果你再次加入,你會去2級深,你會得到兒童的孩子等

編輯:添加圖像(對不起,貧窮的藝術)你應該注意7個圓圈(原表中的每行1)和9結果行(額外的2來自評論1和4具有各2個孩子)

7 circles, 9 resulting rows

相關問題