2010-02-09 78 views
3

我需要找出SQL中查詢父/子關係的最佳方法。一些父字段將成爲孩子的數據。這裏是一個例子:SQL中的父級子記錄關係?

ID  Field1  Field2   ParentId 
-------------------------------------------- 
1  stuff  moreStuff  0 
2  childStuff (from parent) 1 

所以,一個孩子的Field2將是任何父母的價值。我需要弄清楚如何編寫我的SQL,這樣當記錄被取消時,Field @對於孩子來說就是「moreStuff」。我正在使用SQL Server 2008. 謝謝。

+1

缺少規範:查詢應該是遞歸還是隻有一個級別?換句話說,如果一個行的父母也有一個父母,那麼孩子應該得到祖父母的Field2還是父母的Field2? – 2010-02-09 13:41:16

回答

2

假設字段2不能爲空,你可以使用LEFT JOIN與COALESCE:

SELECT T1.ID, T1.Field1, COALESCE(T2.Field2, T1.Field2) AS Field2, T1.ParentID 
FROM Table1 T1 
LEFT JOIN Table1 T2 
ON T1.ParentID = T2.ID 

如果字段2可以爲NULL,用以下替換合併表達式:

CASE WHEN T2.Id IS NULL THEN T1.Field2 ELSE T2.Field2 END AS Field2 
1

在這種情況下,自加入應該爲你做好訣竅。

SELECT child.ID, 
     child.Field1, 
     parent.Field2, 
     child.ParentID 
FROM MyTable child JOIN MyTable parent ON child.ParentID = parent.ID 
1

使用表上的self join

SELECT parent.Field1, parent.Field2, child.ID 
FROM myTable child 
    INNER JOIN myTable parent 
    ON child.ParentId = parent.ID 
1

這種分層查詢通常有一個根節點,一個原動力,一個不是自己孩子的父母。也就是說,記錄ParentId爲空(或者在你的情況下爲0,我認爲它不是真實的ID)。如果這樣在這裏你需要使用一個外連接的情況下,而不是內部的那個......

SELECT parent.Field1, parent.Field2, child.ID 
FROM myTable child 
    LEFT OUTER JOIN myTable parent 
    ON child.ParentId = parent.ID 
/
+0

你是對的。我使用0作爲ParentID,假設它不能爲null,如果設置爲0,它沒有父項。謝謝! – DDiVita 2010-02-09 15:42:19

+0

@DDiVita - 使用0有問題,因爲這意味着您無法使用外鍵強制執行父子關係。 NULL很麻煩,但是魔法值更糟。 – APC 2010-02-09 15:45:10