如表 tid   tm    name
-------------------------
1    0     新闻
2    0     产品
3    0     信息
4    0     关于
5    1     内部新闻
6    1     外部新闻
7    3     行业信息
求排列
id   tm    name
-------------------------
1    0     新闻
5    1     内部新闻
6    1     外部新闻
2    0     产品
3    0     信息
7    3     行业信息
4    0     关于

解决方案 »

  1.   


    --测试数据
    DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
    INSERT @t SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'--深度排序显示处理
    --生成每个节点的编码累计(相同当单编号法的编码)
    DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
    DECLARE @Level int
    SET @Level=0
    INSERT @t_Level SELECT ID,@Level,ID
    FROM @t
    WHERE PID IS NULL
    WHILE @@ROWCOUNT>0
    BEGIN
        SET @Level=@Level+1
        INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
        FROM @t a,@t_Level b
        WHERE a.PID=b.ID
            AND b.Level=@Level-1
    END--显示结果
    SELECT SPACE(b.Level*2)+'|--'+a.Name
    FROM @t a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Sort
    /*--结果
    |--山东省
      |--烟台市
        |--招远市
      |--青岛市
    |--四会市
      |--清远市
        |--小分市
    --*/
      

  2.   

    select * from t order by (case when tm=0 then id else tm end),id
      

  3.   


    ---------------------------------
    --  Author: htl258(Tony)
    --  Date  : 2009-07-09 17:13:05
    ---------------------------------
    --> 生成测试数据表:tbIf not object_id('[tb]') is null
    Drop table [tb]
    Go
    Create table [tb]([id] int,[tm] int,[name] nvarchar(4))
    Insert tb
    Select 1,0,'新闻' union all
    Select 2,0,'产品' union all
    Select 3,0,'信息' union all
    Select 4,0,'关于' union all
    Select 5,1,'内部新闻' union all
    Select 6,1,'外部新闻' union all
    Select 7,3,'行业信息'
    Go
    --Select * from tb-->SQL查询如下:
    ;with t as
    (
      select *,px=id from tb where tm=0
      union all
      select tb.*,t.px from tb,t where tb.tm=t.id
    )
    select id,tm,name from t order by px/*
    id          tm          name
    ----------- ----------- ----
    1           0           新闻
    5           1           内部新闻
    6           1           外部新闻
    2           0           产品
    3           0           信息
    7           3           行业信息
    4           0           关于(7 行受影响)
    */
      

  4.   

    DECLARE @tab TABLE(id INT , tm INT ,NAME VARCHAR(20))
    INSERT INTO @tab 
    SELECT 1,    0 ,   '新闻' UNION ALL 
    SELECT 2,    0 ,   '产品' UNION ALL 
    SELECT 3 ,   0 ,   '信息' UNION ALL 
    SELECT 4,    0 ,   '关于' UNION ALL 
    SELECT 5,    1 ,   '内部新闻' UNION ALL 
    SELECT 6,    1  ,  '外部新闻' UNION ALL 
    SELECT 7,    3  ,  '行业信息' select * from @tab order by (case when tm=0 then id else tm end),id
    id          tm          NAME
    ----------- ----------- --------------------
    1           0           新闻
    5           1           内部新闻
    6           1           外部新闻
    2           0           产品
    3           0           信息
    7           3           行业信息
    4           0           关于(7 行受影响)
      

  5.   

    ------------------------------------------------------------------------
    -- Author : HappyFlyStone 
    -- Date   : 2009-07-09  
    -- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) 
    --       Apr 14 2006 01:12:25 
    --       Copyright (c) 1988-2005 Microsoft Corporation
    --       Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
    --      
    -------------------------------------------------------------------------- Test Data: ta
    IF OBJECT_ID('[ta]') IS NOT NULL 
        DROP TABLE [ta]
    Go
    CREATE TABLE ta([id] INT,[tm] NVARCHAR(1),[name] NVARCHAR(4))
    Go
    INSERT INTO ta
       SELECT 1,'0','新闻' UNION ALL
       SELECT 2,'0','产品' UNION ALL
       SELECT 3,'0','信息' UNION ALL
       SELECT 4,'0','关于' UNION ALL
       SELECT 5,'1','内部新闻' UNION ALL
       SELECT 6,'1','外部新闻' UNION ALL
       SELECT 7,'3','行业信息' 
    GO
    --Start
    SELECT 

    FROM
    TA a
    order by case when tm = 0 then id else  (select id from ta where id = a.tm) end --Result:
    /*
    id          tm   name
    ----------- ---- ----
    1           0    新闻
    5           1    内部新闻
    6           1    外部新闻
    2           0    产品
    3           0    信息
    7           3    行业信息
    4           0    关于(7 行受影响)*/
    --End