递归查询原理SQLServer中的递归查询是通过CTE(表表达式)实现的。至少包含两个查询,第一个查询是一个定点成员,它只是一个返回有效表的查询,用作递归的基点或锚点;第二个查询称为递归成员,使得称为递归成员的查询是触发对CTE名称的递归引用。从逻辑上讲,CTE名称的内部应用可以理解为前面查询的结果集。递归查询的终止条件递归查询没有明确的递归终止条件,只有在第二次递归查询返回空结果集或超过递归次数的最大限制时才停止递归。引用递归次数上限的方法是使用MAXRECURION。递归查询的优点是效率高,在大量数据集下速度比程序查询要快。WITHCTEAS(SELECTcolumn1,column2...FROMtablenameWHEREconditionsUNIONALLSELECTcolumn1,column2...FROMtablenameINNERJOINCTEONconditions)递归查询示例创建测试数据,有员工表Company,parentID是部门ID的父节点,是一个很简单的层级模型。USESQL_RoadGOCREATETABLECompany(DepartmentIDINT,ParentIDINT,DepartmentNameVARCHAR(10))INSERTINTOCompanyVALUES(1,-1,'Headquarters'),(11,1,'财务中心'),(12,1,'人力中心'),(13,1,'信息中心'),(111,11,'会计组'),(112,11,'出纳组'),(121,12,'薪资组')查询Company表中的数据:查询各部门的直接上级ID:WITHCTEAS(SELECTdepartmentID,parentID,departmentname,departmentnameASparentdepartmentnameFROMCompanyWHEREparentID=-1UNIONALLSELECTc.departmentID,c.parentID,c.departmentname,p.departmentnameASparentdepartmentnameFROMCTEPINNERJOINCompanycONp.departmentID=c.parentID)SELECTdepartmentID,parentID,departmentname,parentdepartmentnameFROMCTE结果如下:我们来解读一下上面的代码:1、查询parentID=-1,作为根节点,这是递归查询的起点。2、迭代公式就是UNIONALL下面的查询语句。CTE是在查询语句中调用的,查询语句是CTE的组成部分,即“调用自己”,这就是递归的本质。所谓迭代就是每次递归调用上一次查询的结果集,而UNIONALL就是每次都合并结果集。3.迭代公式使用上一次查询返回的结果集执行特定的查询,直到CTE返回NULL或达到最大迭代次数。默认值为32。最终的结果集是迭代公式返回的结果集的并集。联合由UNIONALL子句定义,只能使用UNIONALL查询路径。下面我们通过层级查询从子节点到父节点的PATH,我们对上面的代码稍作修改:WITHCTEAS(SELECTdepartmentID,parentID,departmentname,CAST(departmentnameASNVARCHAR(MAX))ASdepartmentpathFROMCompanyWHEREparentID=-1UNIONALLSELECTc.DepartmentID,c.ParentID,c.DepartmentName,p.DepartmentPath+'->'+c.DepartmentNameAS部门路径FROMCTEPINNERJOINCompanycONp.DepartmentID=c.ParentID)SELECTdepartmentID,parentID,departmentname,departmentpathFROMCTEwhereCAST(departmentnameASVARCHAR(MAX))将部门名称的长度设置为最大,以防止字段太长超出字段长度。具体结果如下:以上是对递归查询的一些知识的介绍。你可以自己试验。一般情况下,受访者在面试过程中往往会受到考察。希望能帮到大家!
