有个表
tableid(序号)   name(类别名称) order (顺序)            type(所属类别)
1           首饰          5(这里是一个自然排序)  0(0表示没有上级类别) 
2           笔            6(这里是一个自然排序)  0(0表示没有上级类别) 
3           刀            7(这里是一个自然排序)  0(0表示没有上级类别) 
4           项链          8(这里是一个自然排序)  1(1表示项链属于类别1,就是属于首饰类) 
5           铅笔          9(这里是一个自然排序)  2(表示铅笔属于类别2,就是属于笔类) 
6           圆珠笔        10(这里是一个自然排序) 2(表示铅笔属于类别2,就是属于笔类) 
7           菜刀          11(这里是一个自然排序)3(3表示项链属于类别3,就是属于刀类) 
8           水果刀        12(这里是一个自然排序) 3(3表示项链属于类别3,就是属于刀类) 
9           戒指          13(这里是一个自然排序) 1(1表示项链属于类别1,就是属于首饰类) 
 
现在要把属于大类别的商品的顺序排在大类别的后面,就是修改order 字段,让大类别后面是属于这个类别的商品,修改后如下:
id(序号)   name(类别名称) order (顺序)            type(所属类别)
1           首饰             5                     0(0表示没有上级类别) 
2           笔               8                     0(0表示没有上级类别) 
3           刀               11                    0(0表示没有上级类别) 
4           项链             6                     1(1表示项链属于类别1,就是属于首饰类) 
5           铅笔             9                     2(表示铅笔属于类别2,就是属于笔类) 
6           圆珠笔           10                    2(表示铅笔属于类别2,就是属于笔类) 
7           菜刀             12                    3(3表示项链属于类别3,就是属于刀类) 
8           水果刀           13                    3(3表示项链属于类别3,就是属于刀类) 
9           戒指             7                     1(1表示项链属于类别1,就是属于首饰类) 可见,就是首饰的order字段里边,他本来是5,项链和戒指属于首饰类,所以把项链和戒指的顺序就排在5后面,分别替换为6,7
相同的,笔类后面就是笔里边所含的商品,刀后面就是刀所含的商品这个的SQL语句如何写啊
请您教我
 

解决方案 »

  1.   

    就是修改order字段,让相同类别的商品排在一起
      

  2.   

    if object_id('tt') is not null drop table tt 
    create table tt (id int ,name varchar(10),orderid int,type int )
    go
    insert into tt select 1,'首饰',5,0
    insert into tt select 2,'笔',6,0
    insert into tt select 3,'刀',7,0
    insert into tt select 4,'项链',8,1
    insert into tt select 5,'铅笔',9,2
    insert into tt select 6,'圆珠笔',10,2
    insert into tt select 7,'菜刀',11,3
    insert into tt select 8,'水果刀',12,3
    insert into tt select 9,'戒指',13,1goselect case type when 0 then id * 10 else type * 10 + id -3 end orderid_temp,* into #tt  from tt order by case type when 0 then id * 10 else type * 10 + id -3 endselect *,identity(int,1,1) row into #tt1 from #tt order by orderid_tempupdate b set orderid = a.row + 4 from #tt1 a,tt b where a.id = b.id select * from tt --order by orderiddrop table #tt,#tt1
      

  3.   

    gthlu(风子)寫的有點取巧了,是在已知最小order的情況下的。
      

  4.   

    也寫了一個,貼上來吧。Create Table TEST
    (id Int,
     name Nvarchar(10),
     [order] Int,
     type Int)
    GO
    Insert TEST Select 1,           N'首饰',            5,   0
    Union All Select 2,           N'笔',                6,   0
    Union All Select 3,           N'刀',                7,   0
    Union All Select 4,           N'项链',            8,   1
    Union All Select 5,           N'铅笔',            9,   2
    Union All Select 6,           N'圆珠笔',        10, 2
    Union All Select 7,           N'菜刀',            11, 3
    Union All Select 8,           N'水果刀',        12, 3
    Union All Select 9,           N'戒指',            13, 1
    GO
    Select *, (Case type When 0 Then id Else type End) As NewType Into #T From TESTUpdate A Set [order] = 
    (Select Count(*) From #T Where (NewType = A.NewType And id < A.id) Or (NewType < A.NewType)) 
    + (Select Min([order]) From TEST)
    From #T AUpdate A Set [order] = B.[order] From TEST A Inner Join #T B On A.ID = B.IDSelect * From TESTDrop Table #T
    GO
    Drop Table TEST
    --Result
    /*
    id name order type
    1 首饰 5 0
    2 笔 8 0
    3 刀 11 0
    4 项链 6 1
    5 铅笔 9 2
    6 圆珠笔 10 2
    7 菜刀 12 3
    8 水果刀 13 3
    9 戒指 7 1
    */