我现在表结构:F_DEPT_ID,F_PARENT_DEPTID,F_DEPT_NAME
记录 :        1          0      一级部门
              2          1      二级部门
              3          2      三级部门a
              4          2      三级部门b
              5          2      三级部门c我现在取得F_DEPT_ID的id为1,我想取得如下记录
2          1      二级部门
3          2      三级部门a
4          2      三级部门b
5          2      三级部门c如果为2
3          2      三级部门a
4          2      三级部门b
5          2      三级部门c是请递归还是用其他方法实现该存储过程

解决方案 »

  1.   

    --> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([F_DEPT_ID] [int],[F_PARENT_DEPTID] [int],[F_DEPT_NAME] [nvarchar](10))
    INSERT INTO [tb]
    SELECT '1','0','一级部门' UNION ALL
    SELECT '2','1','二级部门' UNION ALL
    SELECT '3','2','三级部门a' UNION ALL
    SELECT '4','2','三级部门b' UNION ALL
    SELECT '5','2','三级部门c'--SELECT * FROM [tb]-->SQL查询如下:
    DECLARE @id INT 
    SET @id=2
    ;WITH t AS
    (
    SELECT * FROM tb WHERE F_DEPT_ID=@id
    UNION ALL
    SELECT tb.* FROM tb,t WHERE tb.F_PARENT_DEPTID=t.F_DEPT_ID
    )
    SELECT * FROM t WHERE F_DEPT_ID<>@id
    /*
    F_DEPT_ID   F_PARENT_DEPTID F_DEPT_NAME
    ----------- --------------- -----------
    3           2               三级部门a
    4           2               三级部门b
    5           2               三级部门c(3 行受影响)
    */05的参考
      

  2.   

    详细参考:http://blog.csdn.net/htl258/archive/2009/04/25/4123827.aspx
      

  3.   

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Create date: 20:36 2010-7-5
    -- Description: <Description,,>
    -- =============================================
    ALTER PROCEDURE usp_GetListByTreeID
    @DEPT_ID INT
    AS
    BEGIN
    SET NOCOUNT ON;    if object_id('[tb]') is not null drop table [tb]
    create table [tb] (F_DEPT_ID INT,F_PARENT_DEPTID INT,F_DEPT_NAME varchar(50))
    insert into [tb]
    select 1,0,'一级部门' union all
    select 2,1,'二级部门' union all
    select 3,2,'三级部门a' union all
    select 4,2,'三级部门b' union all
    select 5,2,'三级部门c' 

    SELECT * FROM [tb] ;WITH t AS
    (
    SELECT * FROM tb WHERE F_DEPT_ID=@DEPT_ID
    UNION ALL
    SELECT tb.* FROM tb,t WHERE tb.F_PARENT_DEPTID=t.F_DEPT_ID
    )
    SELECT * FROM t WHERE F_DEPT_ID<>@DEPT_IDEND
    GO
      

  4.   

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Create date: 20:36 2010-7-5
    -- Description: <Description,,>
    -- =============================================
    ALTER PROCEDURE usp_GetListByTreeID
    @DEPT_ID INT
    AS
    BEGIN
    SET NOCOUNT ON;    if object_id('[tb]') is not null drop table [tb]
    create table [tb] (F_DEPT_ID INT,F_PARENT_DEPTID INT,F_DEPT_NAME varchar(50))
    insert into [tb]
    select 1,0,'一级部门' union all
    select 2,1,'二级部门' union all
    select 3,2,'三级部门a' union all
    select 4,2,'三级部门b' union all
    select 5,2,'三级部门c' 

    SELECT * FROM [tb] ;WITH t AS
    (
    SELECT * FROM tb WHERE F_DEPT_ID=@DEPT_ID
    UNION ALL
    SELECT tb.* FROM tb,t WHERE tb.F_PARENT_DEPTID=t.F_DEPT_ID
    )
    SELECT * FROM t WHERE F_DEPT_ID<>@DEPT_IDEND
    GO