我正在编写一个查询,需要在任何给定的父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 :(得分: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
的想法。