做一个无限级分类菜单,表如下:ID   Name        ParentID
1    合同管理    0
2    录入数据    1
3    分析统计    1
4    系统管理    0
5    用户管理    4
用一个查询怎么实现如下结果:ID   Name        ParentName
2    录入数据    合同管理

解决方案 »

  1.   

    --------------------------------------------------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2010-04-28 17:06:11
    --  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
    --          Jul  9 2008 14:43:34 
    --          Copyright (c) 1988-2008 Microsoft Corporation
    --          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
    --  Blog   : http://blog.csdn.net/htl258
    --------------------------------------------------------------------------
    --> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([ID] INT,[Name] NVARCHAR(10),[ParentID] INT)
    INSERT [tb]
    SELECT 1,N'合同管理',0 UNION ALL
    SELECT 2,N'录入数据',1 UNION ALL
    SELECT 3,N'分析统计',1 UNION ALL
    SELECT 4,N'系统管理',0 UNION ALL
    SELECT 5,N'用户管理',4
    GO
    --SELECT * FROM [tb]
    select ID,Name,ParentName=(select Name from tb where id=t.[ParentID]) from tb t where ID=2
    /*
    ID          Name       ParentName
    ----------- ---------- ----------
    2           录入数据       合同管理(1 行受影响)
    */?
      

  2.   


    select ID, Name, (select ParentName from table b where b.id=a.ParentName)as ParentName from table a
      

  3.   

    写错了。。
    更新select ID, Name, (select Name from table b where b.id=a.ParentName)as ParentName from table a
      

  4.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2010-04-28 17:22:41
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([ID] int,[Name] varchar(8),[ParentID] int)
    insert [tb]
    select 1,'合同管理',0 union all
    select 2,'录入数据',1 union all
    select 3,'分析统计',1 union all
    select 4,'系统管理',0 union all
    select 5,'用户管理',4
    --------------开始查询--------------------------
    select
     b.id,b.name,a.name as ParentName
    from
     tb a,
     tb b
    where
     a.id=b.ParentID
    and
     b.ID=2
    ----------------结果----------------------------
    /*id          name     ParentName
    ----------- -------- ----------
    2           录入数据     合同管理(1 行受影响)*/
      

  5.   

    谢谢各位,假如包含连接查询该怎么弄:a表
    ID  Name   ParentID   TypeID
    1  合同管理 0          1 
    2  录入数据 1          2
    3  分析统计 1          1
    4  系统管理 0          2
    5  用户管理 4          1b表
    ID    Name
    1     窗体
    2     子窗体需要结果:
    ID Name ParentName  TypeName
    2 录入数据 合同管理    子窗体
      

  6.   

    create table [a]([ID] int,[Name] varchar(8),[ParentID] int,TypeID int)
    insert [a]
    select 1,'合同管理',0,1 union all
    select 2,'录入数据',1,2 union all
    select 3,'分析统计',1,1 union all
    select 4,'系统管理',0,2 union all
    select 5,'用户管理',4,1
    create table b(ID int,Name varchar(10))
    insert into b values(1 ,'窗体')
    insert into b values(2 ,'子窗体')
    goselect t1.ID ,t1.Name,t2.Name ParentName , t3.Name TypeName
    from a t1 , a t2 , b t3
    where t1.id = 2 and t1.ParentID = t2.id and t1.TypeID = t3.iddrop table a , b/*
    ID          Name     ParentName TypeName   
    ----------- -------- ---------- ---------- 
    2           录入数据     合同管理       子窗体(所影响的行数为 1 行)
    */