暑期小学期在做控制流图(CFG)相关的一个项目。我们准备用关系数据库来存储CFG的信息。在查询时,为了得到所有dominate关系的结果,使用了CTE来进行递归查询。
简单例子如下:
1. 现有表testRe结构如下
2. 欲得到的查询结果为找到id=’a’的项的所有pId,即b、c、d
3. 使用CTE做递归查询:
WITH Re_CTE(id, pId, Level)
AS
(
SELECT id, pId, 1 AS [Level]
FROM testRe
WHERE id='a'
UNION ALL
SELECT t.id, t.pId, [Level] + 1
FROM testRe t INNER JOIN Re_CTE ct
ON t.id=ct.pId
)
SELECT * FROM Re_CTE
其中,Level为可选项
4. 查询结果为:
5. CTE的简单说明(参考MSDNhttp://msdn.microsoft.com/zh-cn/library/ms186243%28SQL.90%29.aspx):
WITH cte_name ( column_name [,...n] )
AS
(
CTE_query_definition –- Anchor member is defined.
UNION ALL
CTE_query_definition –- Recursive member is defined referencing cte_name.
)
-- Statement using the CTE
SELECT *
FROM cte_name
一个递归 CTE 结构必须至少包含一个定位点成员和一个递归成员。
执行时:
Technorati 标签: SQL SERVER,CTE,递归,查询