SQL(SQL Server 2008)针对特定结果的分层查询和子树查询

时间:2013-06-10 12:05:17

标签: sql sql-server sql-server-2008 tsql hierarchical-data

我有一个关于为分层查询返回的结果子树编写查询的问题。

基本上我必须从具有组织和子组织的表中提取数据。组织是分层的,并使用数字序列作为标识符。可以将名称分配给多个组织。我已经编写了这个标准的段并且正在编写和工作(在下面)。

但是,现在,我必须返回子树的结果(此段是现在要写的内容),用于即将发布的网页。它将返回搜索功能的结果,其中用户输入名称并可以查看与该名称相关联的所有组织代码。我对如何使用分层查询执行此操作感到茫然,并且非常感谢任何帮助。

以下是分层查询的工作代码:

WITH OrgCode_hierarchy (ParentOrgCodeID, OrgCodeID, OrgCode, OrgName, OrgCodeSortOrder, LEVEL) AS
(

      SELECT o_base.ParentOrgCodeID, o_base.OrgCodeID, o_base.OrgCode, o_base.OrgName, cast('::' + o_base.OrgCode  + '::' AS VARCHAR (200)) AS OrgCodeSortOrder, 0 AS LEVEL
      FROM L_OrgCode o_base
      WHERE o_base.OrgCode is not null


      UNION all

      SELECT o_child.ParentOrgCodeID, o_child.OrgCodeID, o_child.OrgCode, o_child.OrgName,  cast (ho.OrgCodeSortOrder + CASE WHEN left(o_child.OrgCode, 2) = '::' THEN '::' ELSE '' END  + o_child.OrgCode + '::' AS VARCHAR (200)) AS OrgCodeSortOrder, LEVEL + 1 AS LEVEL
      FROM L_OrgCode o_child
      inner join OrgCode_hierarchy ho on o_child.ParentOrgCodeID = ho.OrgCodeID
)     

SELECT DISTINCT ParentOrgCodeID, OrgCodeID, OrgCode, OrgName, OrgCodeSortOrder, LEVEL
FROM OrgCode_hierarchy 
ORDER BY 1

以下是该查询返回结果的示例:

Hierarchical query results sample

再次感谢!

2 个答案:

答案 0 :(得分:1)

难道你不能只在CTE中添加用户的Id,只需在最终查询中添加where子句吗?即:

SELECT DISTINCT ParentOrgCodeID, OrgCodeID, OrgCode, OrgName, OrgCodeSortOrder, LEVEL
FROM OrgCode_hierarchy 
**where [UserId] = '[UserId]'**
ORDER BY 1

答案 1 :(得分:-1)

公用表表达式(CTE)提供了能够引用自身的显着优势,从而创建递归CTE。递归CTE是一种重复执行初始CTE以返回数据子集直到获得完整结果集的CTE。

更多详情: http://rajeshprajapati.blogspot.in/2012/04/recursive-query-for-parent-id.html