WEB开发网
开发学院数据库MSSQL Server SQL2005/2008中的CTE应用--递归查询 阅读

SQL2005/2008中的CTE应用--递归查询

 2009-10-25 00:00:00 来源:WEB开发网   
核心提示: 一个典型的应用场景是:在这个自关联的表中,查询以PKID为2的分类包含所有子分类,SQL2005/2008中的CTE应用--递归查询(3),也许很多情况下,我们不得不用临时表\表变量\游标等,此时会出错,Msg530,Level16,State1,Line1Thestatementtermina

一个典型的应用场景是:在这个自关联的表中,查询以PKID为2的分类包含所有子分类。也许很多情况下,我们不得不用临时表\表变量\游标等。现在我们有了CTE,就简单多了

CTEDemo1
WITH SimpleRecursive(C_Name, PKID, C_Code,C_Parent) 
    AS
(SELECT C_Name, PKID, C_Code,C_Parent  FROM CategorySelf WHERE PKID = 2
UNION ALL
SELECT p.C_Name, p.PKID, p.C_Code,p.C_parent
 FROM CategorySelf  P  INNER JOIN
 SimpleRecursive A ON A.PKID = P.C_Parent
)
SELECT sr.C_Name as C_Name, c.C_Name as C_ParentName,sr.C_Code as C_ParentCode
FROM SimpleRecursive sr inner join CategorySelf c
on sr.C_Parent=c.PKID

查询结果如下:

C_Name    C_ParentName    C_ParentCode
分类5    分类2    2
分类8    分类5    2/5
分类12    分类8    2/5/8
分类13    分类8    2/5/8

感觉怎么样?如果我只想查询第二层,而不是默认的无限查询下去,

可以在上面的SQL后加一个选项 Option(MAXRECURSION 5),注意5表示到第5层就不往下找了。如果只想找第二层,但实际结果有三层,此时会出错,

 Msg 530, Level 16, State 1, Line 1
The statement terminated. The maximum recursion 1 has been exhausted before statement completion.

此时可以通过where条件来解决,而保证不出错,看如下SQL语句:

CTEDemo2
WITH SimpleRecursive(C_Name, PKID, C_Code,C_Parent,Sublevel) 
    AS
(SELECT C_Name, PKID, C_Code,C_Parent,0  FROM CategorySelf WHERE PKID = 2
UNION ALL
SELECT p.C_Name, p.PKID, p.C_Code,p.C_parent,Sublevel+1
 FROM CategorySelf  P  INNER JOIN
 SimpleRecursive A ON A.PKID = P.C_Parent
)
SELECT sr.C_Name as C_Name, c.C_Name as C_ParentName,sr.C_Code as C_ParentCode
FROM SimpleRecursive sr inner join CategorySelf c
on sr.C_Parent=c.PKID
where SubLevel<=2

上一页  1 2 3 4  下一页

Tags:SQL CTE 应用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接