`

SQL Server:可自定义参数的父子关系查询

阅读更多

在SQL Server里边执行父子关系查询,第一时间想到的应该是CTE(要是对CTE不太了解,可以参考这篇,讲的超详细),它兼顾了union all和递归的属性,用起来简单效率也不错。好啦,言归正传,先说说测试的基本信息:

数据库版本:SQL Server2005(CTE从2005开始支持的,2005以下的都不支持这个)

所用表:s_user

字段对应关系:S_USER_ID是其他记录的S_USER_SJ_ID。

SQL如下:

WITH result     
 AS (   
 SELECT * FROM S_USER  su WHERE su.S_DEPARTMENT_ID in (5) and (su.s_user_id=84) 
 UNION ALL     
 SELECT child.* FROM S_USER AS child INNER JOIN result  AS result 
ON child.S_USER_SJ_ID = result.s_user_id
) 
SELECT S_USER_ID,S_DEPARTMENT_ID,S_Department_Name,S_USERNAME,S_USER_SJ_NAME,S_USER_SJ_ID  FROM result  order by S_USER_SJ_ID ;

以上的SQL中有个问题,就是user的S_DEPARTMENT_ID和s_user_id是写死的,不能根据实际情况直接进行查询,如此就需要引入参数的问题了。实现思路如下:

将以上的查询信息定义到一个自定义的方法中,该方法带两个参数,然后将查询结果以table的形式返回,最后直接调用该方法。

具体实现SQL如下:

CREATE FUNCTION fu_userInfo
( @departmentid nvarchar(30),@userid nvarchar(30) )
RETURNS table
AS
RETURN (
WITH result     
 AS (   
 SELECT * FROM S_USER  su WHERE su.S_DEPARTMENT_ID in (@departmentid) and (su.s_user_id=@userid) 
 UNION ALL     
 SELECT child.* FROM S_USER AS child INNER JOIN result  AS result 
ON child.S_USER_SJ_ID = result.s_user_id
) 
SELECT S_USER_ID,S_DEPARTMENT_ID,S_Department_Name,S_USERNAME,S_USER_SJ_NAME,S_USER_SJ_ID  FROM result
)

--执行查询
SELECT * FROM fu_userInfo(5,84) order by S_USER_SJ_ID

参考链接:

1、Sql Server父子关系迭代查询SQL:http://terry0501.iteye.com/blog/1896929
2、在SQL Server中,关于with as使用介绍:http://jc-dreaming.iteye.com/blog/772030
3、sql server 视图中定义参数:http://www.cnblogs.com/qanholas/archive/2012/07/19/2599613.html 

 

分享到:
评论

相关推荐

    sql_函数实现三种父子递归

    在SQL Server 2005及以上版本,还可以使用公用表表达式(CTE)进行递归查询,以更简洁的方式完成相同的功能。 2. 查找所有父节点(反向递归): 与查找子节点相反,我们从一个节点开始,向上查找其所有父节点直至根...

    sqlserver父子层次查询.pdf

    本文件"sqlserver父子层次查询.pdf"主要探讨了如何使用递归公共表表达式(Recursive Common Table Expression, CTE)来解决这类问题。下面将详细解释相关知识点。 1. **递归公共表表达式(Recursive CTE)**: ...

    sql查询某个parentid下的所有childid

    ### SQL查询某个parentId下的所有childId 在数据库管理和应用开发中,经常需要查询某一特定节点下的所有子节点信息。例如,在组织结构、产品分类等层级数据管理中,我们需要获取某个父级分类的所有子分类,包括直接...

    SQL_Server数据库试题六及答案

    - (B) 层次型:另一种早期的数据库模型,支持单一的父子关系。 - (C) 关系型:基于关系模型的数据库系统。 - (D) 以上都不是 - **正确答案**:(C) 关系型。 - **知识点说明**:SQL Server 2000是一种关系型...

    SQL Server 2000看图教程6

    - **创建父子层次的多维数据集**:维向导可以帮助创建具有父子关系的多维数据集。 - **创建虚拟维度**:通过维向导也可以创建虚拟维度,这类维度不直接对应于物理表,而是根据实际需求动态生成。 #### 四、利用分析...

    Asp.net C# 树形菜单+sql2000数据库

    树形菜单是一种以层级结构展示数据的UI元素,它模仿了自然界中的树状结构,通常用于呈现具有父子关系的数据。在ASP.NET中,我们可以使用TreeView控件来创建这样的菜单。 1. **TreeView控件**:ASP.NET内置的...

    asp+sql 目录树实现

    这些信息可以存储在一个具有父子关系的表格中,通常包含字段如`DirectoryID`,`ParentDirectoryID`,`DirectoryName`等。 接下来,我们将使用ADO.NET连接到SQL Server数据库,执行查询并遍历结果集,为每个目录创建...

    SQL Server 公用表表达式(CTE)实现递归的方法

    公用表表达式(CTE,Common Table Expression)是SQL Server中的一个重要特性,它允许你在复杂的查询中定义一个临时的结果集,这个结果集只在当前查询的执行范围内有效。CTE可以用于SELECT、INSERT、UPDATE、DELETE...

    ASP.net c# 无限极树菜单

    - 数据源:通常来自数据库,如SQL Server 2000,其中表的字段可能包括ID、父ID和节点名称等,用于构建父子关系。 - 数据绑定:将数据源与TreeView控件绑定,通过HierarchicalDataTemplate定义每个节点的显示样式和...

    帆软初级证书题库及答案

    42. 父子格关系:父子格关系包括嵌套和关联两种形式。 43. 填报界面控件:某些控件如表格控件在填报界面中可能不可用。 44. 数据迁移支持的数据库类型:包括MySQL、Oracle、SQL Server、DB2、PostgreSQL等。 45. ...

    ASP.NET 直接绑定标准SQL数据表的树

    首先,你需要有一个包含层级关系的数据表,通常这样的表会有一个字段表示父节点ID,用于建立父子节点的关系。例如,我们可以有如下的表结构: 1. 表名:TreeNodes 2. 字段:NodeID(主键,唯一标识),ParentNodeID...

    Delphi读取数据库并建立Treeview树状视图目录..rar

    对于树形结构,通常需要一个表示层级关系的字段,如“ParentID”或“CategoryID”,这样可以根据这些字段构建父子关系。 4. **填充Treeview**:使用Treeview的AddChild、AddChildFirst等方法添加节点。每个数据库...

    what a good day of today

    "100126c_父子关系树及下级数量统计.sql"继续深化了对层级数据的理解,可能包含了递归查询或者自连接来获取树状结构的子节点总数。 最后,"20100202_很多项.sql"虽然没有明确的主题,但很可能包含了一系列不同的SQL...

    Reporting Service 父子下拉树型菜单,父子下钻

    1. **数据准备**:确保你的数据库中包含了父子关系的数据模型。这可能涉及到多维数据集或者关系数据库中的关联表。 2. **报表设计**:使用 Reporting Service 的 Report Designer 创建报表,并设置参数以允许用户...

    学校层次关系表

    节点之间存在父子关系,一个节点可以有多个子节点,但只有一个父节点(根节点除外)。这样的结构便于实现诸如添加新节点、删除已有节点和修改节点信息等操作。 在SQLServer数据库中,存储学校层次关系的方法有两种...

    WEB UI框架的成熟引领新的开发模式 JEECG(J2EE Code Generation)

    JEECG框架还支持多种数据库,包括但不限于SQLServer、Oracle和MySQL。该框架还抽象出了单表数据模型和一对多(父子表)数据模型,可以根据这些模型生成多套不同的展示形式,使得开发过程更加高效和简洁。 JEECG还...

    c#关于datagrid和treeview控件的使用心得.rar

    在MIS系统开发中,`DataGridView`常用于展示大量结构化的数据,如报表、记录列表,而`TreeView`则适合展示非线性、具有父子关系的信息,如部门结构或文件目录。 结合使用这两个控件,开发者可以创建出既直观又易于...

    Cache数据库系统开发培训

    - **表的关联关系**:通过`F3`键查看字段所指向的表以及父子表关系。 #### 六、字段类型与表结构设计 - **字段类型**: - **指向关系**:`DesignativeReference`,用于表示字段之间的指向关系。 - **多选类型**...

Global site tag (gtag.js) - Google Analytics