2012-06-28 138 views
0

我正在寫一個查詢,需要返回任何給定的父ID下的所有子條目(和他們的孩子等...)。聯盟選擇嵌套查詢

例如:

SELECT id 
FROM table 
WHERE parent_id IN 

    (SELECT id 
    FROM table 
    WHERE parent_id IN 

     (SELECT id 
     FROM table 
     WHERE parent_id IN 

      (SELECT id 
      FROM table 
      WHERE code = 'A01') 
     ) 
    ) 

正如預期的那樣,這樣只會返回一個結果集的最頂端SELECT查詢。我可以爲每個兒童級別編寫一個UNION SELECT,但這看起來有點笨拙...

有沒有方法可以將每個嵌套查詢中的每個單獨結果集添加到我的主要結果集中?或者我應該採取笨拙的選擇?

+0

哪個版本的SQL? 2005年以後你可以使用[遞歸CTE](http://msdn.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx)。 – Jamiec

+0

對不起,我正在使用sql server 2008 – Elliott

回答

3

您的問題最好用遞歸查詢來解決。一個偉大的方式在SQL Server 2005中執行遞歸查詢或更高版本是使用Common Table Expressions

;with cte as (
    SELECT id, parent_id 
    FROM [table] 
    WHERE code = 'A01' 

    UNION ALL 

    SELECT t.id, t.parent_id 
    FROM [table] t 
     INNER JOIN cte 
      ON cte.id = t.parent_id 
) 
SELECT id 
FROM cte 
OPTION (MAXRECURSION 0); 

在一個側面說明...我不知道我喜歡的表名是table的想法。

+0

:D謝謝。舉例來說,我用表格和列的名稱來表示;) – Elliott