2013-11-14 229 views
1

我有一個表,允許父行有多個孩子:選擇父母和所有的孩子要麼給家長或孩子的ID

ID ParentID Name 
1  NULL  'I am the parent' 
2  1   'I am a child' 
3  1   'I am another child' 
4  NULL  'I am a loner' 

我在尋找最簡單,最有效的方式可以從該「家族」中的任何給定ID返回「家族」中的所有行。如果給出1,2或3,則前三行將被返回,並且如果給定4,則僅返回最後一行*。

如果合理(或某種存儲過程),我很樂意將其作爲單個SQL調用,因爲這會經常調用。

我最好的嘗試已導致多個呼叫:

SELECT ParentID FROM Person WHERE ID = @id 

/*if (parentid == null)*/ 
    SELECT * FROM Person WHERE ID = @id OR ParentID = @id 
/*else*/ 
    SELECT * FROM Person WHERE ID = @parentid OR ParentID = @parentid 

* 父母本身不能有一個父類,所以應該不需要遞歸。

+0

有什麼錯你的第二個查詢? http://sqlfiddle.com/#!6/5f39c/2/0它似乎返回你想要的。 –

+0

@TimSchmelter,因爲如果@ id = 2或@id = 3,所有三行都需要返回 – snumpy

回答

3

您需要這些OR s到找到你的家人:

SELECT * FROM Person WHERE ID = @id 
OR ParentID = @id 
OR ID = (SELECT ParentID FROM Person p2 
     WHERE ID = @id) 
OR ParentID = (SELECT ParentID FROM Person p2 
     WHERE ID = @id) 

Demo

+0

您可以使用'IN(Id,ParentID)'http://sqlfiddle.com/#!來刪除重複的子查詢。 6/5f39c/16我知道這是一個奇怪的用法 –

+0

@ConradFrix:謝謝,有趣。之前我沒有以這種方式使用過「IN」。但是,我仍然喜歡子查詢。更重要的是自SQL Server將(希望)優化它們。 –