id        name         pid           memo
1 总公司         0     ddd
2 财务部门 1 NULL
3 生产部门 1 NULL
4 分公司         0               NULL
5 分财务部门 4 NULL
7 分生产部门 4 NULL
8 分1         0            NULL
9 财务1         8 NULL
10 成产1         8 NULL
我想实现的是这样的结果   总公司       无
财务部门     总公司
生产部门     总公司
分公司       无
分财务部门   分公司
分生产部门   分公司
分1          无
财务1      分1
生产1      分1这样的形式能实现麽 ?谢谢大家啦数据库sql

解决方案 »

  1.   

    --try
    select a.name,isnull(b.name,'无')
    from tb a left join tb b
    on a.pid=b.id
      

  2.   

    WITH CTE(Id,Name,Pid,Memo)
    AS (
    SELECT 1, N'总公司',0,'ddd' UNION ALL
    SELECT 2, N'财务部门', 1,NULL UNION ALL
    SELECT 3, N'生产部门', 1,NULL UNION ALL
    SELECT 4, N'分公司',0,NULL UNION ALL
    SELECT 5, N'分财务部门',4,NULL UNION ALL
    SELECT 7, N'分生产部门',4,NULL UNION ALL
    SELECT 8, N'分1',0,NULL UNION ALL
    SELECT 9, N'财务1', 8, NULL UNION ALL
    SELECT 10, N'成产1',8, NULL
    )
    SELECT Name
    ,CASE WHEN Pid=0 THEN N'无' 
    WHEN Pid=1 THEN N'总公司'
    WHEN Pid=4 THEN N'分公司'
    WHEN  Pid=8 THEN N'分1' 
     ELSE '' END AS col
    FROM CTE
      

  3.   

    是这样不:
    if object_id('tb') is not null
       drop table tb
    gocreate table tb(Id int,Name varchar(20),Pid int,Memo varchar(100))insert into tb
    SELECT 1, N'总公司',0,'ddd' UNION ALL
    SELECT 2, N'财务部门', 1,NULL UNION ALL
    SELECT 3, N'生产部门', 1,NULL UNION ALL
    SELECT 4, N'分公司',0,NULL UNION ALL
    SELECT 5, N'分财务部门',4,NULL UNION ALL
    SELECT 7, N'分生产部门',4,NULL UNION ALL
    SELECT 8, N'分1',0,NULL UNION ALL
    SELECT 9, N'财务1', 8, NULL UNION ALL
    SELECT 10, N'成产1',8, NULLselect t1.name,
           case when t2.name is null then '无' else t2.name end as name
    from tb t1
    left join tb t2
           on t1.pid = t2.id
    /*
    name     name
    总公司     无
    财务部门     总公司
    生产部门     总公司
    分公司     无
    分财务部门   分公司
    分生产部门 分公司
    分1         无
    财务1     分1
    成产1     分1
    */
      

  4.   

    楼上对的,我还没看规律呢,厚颜了。。
    WITH CTE(Id,Name,Pid,Memo)
    AS (
    SELECT 1, N'总公司',0,'ddd' UNION ALL
    SELECT 2, N'财务部门', 1,NULL UNION ALL
    SELECT 3, N'生产部门', 1,NULL UNION ALL
    SELECT 4, N'分公司',0,NULL UNION ALL
    SELECT 5, N'分财务部门',4,NULL UNION ALL
    SELECT 7, N'分生产部门',4,NULL UNION ALL
    SELECT 8, N'分1',0,NULL UNION ALL
    SELECT 9, N'财务1', 8, NULL UNION ALL
    SELECT 10, N'成产1',8, NULL
    )
    SELECT DISTINCT A.Name,ISNULL(B.Name,N'无') AS Col
    FROM CTE AS A 
    LEFT JOIN CTE AS B
    ON A.pid=B.Id
      

  5.   

    with 循环吧
    WITH CTE(Id,Name,Pid,Memo)
    AS (
    SELECT 1,    N'总公司',0,'ddd' UNION ALL
    SELECT 2,    N'财务部门',    1,NULL UNION ALL
    SELECT 3,    N'生产部门',    1,NULL UNION ALL
    SELECT 4,    N'分公司',0,NULL UNION ALL
    SELECT 5,    N'分财务部门',4,NULL UNION ALL
    SELECT 7,    N'分生产部门',4,NULL UNION ALL
    SELECT 8,    N'分1',0,NULL UNION ALL
    SELECT 9,    N'财务1', 8,    NULL UNION ALL
    SELECT 10,    N'成产1',8,    NULL
    ),
    cte1 as
    (select [id],[name],pid from CTE where Pid=0
    union all
    select b.Id,b.Name,a.Id from cte1 a,CTE b where a.Id=b.Pid)
    select a.Name,b.name from cte1 a left join cte b on a.pid=b.id order by a.id 
      

  6.   


    create table sx
    (id int, name varchar(10), pid int, memo varchar(10))insert into sx
     select 1,'总公司',0,'ddd' union all
     select 2,'财务部门',1,NULL union all
     select 3,'生产部门',1,NULL union all
     select 4,'分公司',0,NULL union all
     select 5,'分财务部门',4,NULL union all
     select 7,'分生产部门',4,NULL union all
     select 8,'分1',0,NULL union all
     select 9,'财务1',8,NULL union all
     select 10,'成产1',8,NULL
    select a.name 'name',
           isnull(b.name,'无') 'pname'
     from sx a
     left join sx b on a.pid=b.id/*
    name       pname
    ---------- ----------
    总公司         无
    财务部门       总公司
    生产部门       总公司
    分公司         无
    分财务部门     分公司
    分生产部门     分公司
    分1           无
    财务1         分1
    成产1         分1(9 row(s) affected)
    */