联盟选择嵌套查询

时间:2012-06-28 14:43:42

标签: sql-server sql-server-2008

我正在编写一个查询,需要在任何给定的父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,但这看起来有点笨拙......

有没有办法将每个嵌套查询中的每个结果集添加到我的主要结果集中?或者我应该采取笨拙的选择吗?

1 个答案:

答案 0 :(得分: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的想法。