CREATE TABLE [dbo].Table1(
[TitleId] [int] IDENTITY(1,1) NOT NULL,
[Title] [varchar](200) COLLATE Chinese_PRC_CI_AS NULL,
[TitleCode] [uniqueidentifier] NULL,
[DirName] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL,
        [PagePre] [uniqueidentifier] NULL,
一个故事有多条记录,dirname就是故事名称。titlecode是每条记录的编号。
一个故事的所有记录的顺序是按照titleid排序的。目的:更新PagePre字段。也就是更新当前记录的上一条记录的titlecode,如果该记录是但前故事的第一条记录,那么pagePre为NULL.
下面是我写的,这个语句我个人认为没问题,但是有错误的,根本查不出结果。
select b.titlecode
from Table1  as b
where b.dirname='芙蓉姐姐的故事' and  b.titleid= (
select top 1 a.titleid
from Table1  as a where a.dirname='芙蓉姐姐的故事' and a.titleid>b.titleid不想使用游标,谢谢大家的帮助,给出解决思路,最好能指出我的语句为什么是错误的。再次表示感谢!      

解决方案 »

  1.   

    写一种方法:
    select 
    *,
    (select 1 from table1 where  titleid=(select max(titleid) from table1 where titleid<t.titleid))
    from 
    table1 t
    计算当前记录前一条记录
      

  2.   

    下面是我写的,这个语句我个人认为没问题,但是有错误的,根本查不出结果。 
    select b.titlecode 
    from Table1  as b 
    where b.dirname= '芙蓉姐姐的故事 ' and  b.titleid= ( 
    select top 1 a.titleid 
    from Table1  as a where a.dirname= '芙蓉姐姐的故事 ' and a.titleid >b.titleid select b.titlecode 
    from Table1  as b 
    where b.dirname= '芙蓉姐姐的故事 ' and  exists ( 
    select top 1 a.titleid 
    from Table1  as a where a.dirname= '芙蓉姐姐的故事 ' and a.titleid >b.titleid 
      

  3.   

    top 1--与exists的用法不正确
      

  4.   

    如果表中只有一条dirname= '芙蓉姐姐的故事 '的数据,肯定查不出数据。
      

  5.   

    用列名加in

    top 1结果集 用别名
    再用exists
      

  6.   

    select top 1 
          b.titlecode 
    from Table1 as b 
    where b.dirname= '芙蓉姐姐的故事' 
          and exists (select *
                       from Table1  
                       where dirname= '芙蓉姐姐的故事' and titleid >b.titleid )
      

  7.   

    各位的答复都没解决问题哦,我要更新pagePre哦roy_88 能否详细些呢? 谢谢。
      

  8.   

    select top 1 
          b.titlecode 
    from Table1 as b 
    where b.dirname= '芙蓉姐姐的故事' 
          and exists (select *
                       from Table1  
                       where dirname= '芙蓉姐姐的故事' and titleid >b.titleid )
    ---
    只是获得 dirname= '芙蓉姐姐的故事' 的第一条记录。我要更新所有 dirname= '芙蓉姐姐的故事' 的记录的pagePre字段,这个字段就是titleid比当前记录小且与他最接近的的那个记录的titlecode1,如果当前记录是 该故事的第一条记录那么pagePre就可以不更新(即为NULL)再次表示感谢。
      

  9.   


    2605 芙蓉姐姐的故事1 FAA5BDE9-0CB2-496D-8D78-7CD9EF006084 芙蓉姐姐的故事  
    2606 芙蓉姐姐的故事2 695D6C3E-809B-4C10-9D7A-DB7E0E32811C 芙蓉姐姐的故事   FAA5BDE9-0CB2-496D-8D78-7CD9EF006084 
    2607 芙蓉姐姐的故事3 4B42DE97-ED65-4687-98CA-CF4C634CFB11 芙蓉姐姐的故事   695D6C3E-809B-4C10-9D7A-DB7E0E32811C 
    2608 芙蓉姐姐的故事4 525F3F6A-70BD-4060-A8A1-364EDB6529A9 芙蓉姐姐的故事   4B42DE97-ED65-4687-98CA-CF4C634CFB11 
    2609 芙蓉姐姐的故事5 CDC0041C-84FA-4A8D-850A-9E96289FF07A 芙蓉姐姐的故事   525F3F6A-70BD-4060-A8A1-364EDB6529A9  红色的是要更新的pagepre字段
      

  10.   

    不是非常明白LZ的意思, 如果是利用前一条同样DirName的记录来更新后一条记录(PagePre存前一条titleCode的值?),那么下面的query可以做到这一点(因为我的SQL是英文系统的, 所以弄不了中文):set nocount on
    create table table1
    ( TitleID int Identity(1,1) not null,
    Title varchar(200) null,
    TitleCode uniqueidentifier null,
    DirName varchar(100) null,
    PagePre uniqueidentifier null
    )insert table1 (TitleCode, DirName)
    select newID(), 'FRJJ''s story'
    union all select newID(), 'FRMM''s story'
    union all select newID(), 'FRGG''s story'
    union all select newID(), 'FRDD''s story'
    union all select newID(), 'FRJJ''s story'
    union all select newID(), 'FRMM''s story'
    union all select newID(), 'FRGG''s story'
    union all select newID(), 'FRDD''s story'
    union all select newID(), 'FRJJ''s story'
    union all select newID(), 'FRMM''s story'
    union all select newID(), 'FRGG''s story'
    union all select newID(), 'FRDD''s story'
    GOupdate table1
    set PagePre = (select titlecode from table1
    where DirName = t.DirName AND titleid = 
    (select max(titleID) from table1 where DirName = t.DirName AND titleid < t.titleid))
    from table1 tselect * from table1GO
    drop table table1
    GO
    TitleID Title   TitleCode                               DirName         PagePre
    ----------------------------------------------------------------------------------------------------------------
    1 NULL 48CCBE9B-9693-4F21-99E9-64FE76A7F58D FRJJ's story NULL
    2 NULL A7BF88DB-4DC2-4F65-9497-ACB5DEF4E906 FRMM's story NULL
    3 NULL 7E9A1B85-8FB7-4711-AC9A-850DC50025D1 FRGG's story NULL
    4 NULL B2105BA2-866C-4B1C-844A-371BEE51199B FRDD's story NULL
    5 NULL 3A1D044E-E71B-4670-882A-7DE856D2F440 FRJJ's story 48CCBE9B-9693-4F21-99E9-64FE76A7F58D
    6 NULL 9A968879-531A-406D-B3D0-57EE824D412C FRMM's story A7BF88DB-4DC2-4F65-9497-ACB5DEF4E906
    7 NULL 468CBAF4-8755-45D8-9243-15F6B7507E48 FRGG's story 7E9A1B85-8FB7-4711-AC9A-850DC50025D1
    8 NULL 80CDD92D-16F4-4BD1-ACED-1F0E88E4050A FRDD's story B2105BA2-866C-4B1C-844A-371BEE51199B
    9 NULL C2B70909-F4DF-4022-9169-13A0653C9C72 FRJJ's story 3A1D044E-E71B-4670-882A-7DE856D2F440
    10 NULL 47496F21-CEDD-4DE9-A2FB-97AD446DB93F FRMM's story 9A968879-531A-406D-B3D0-57EE824D412C
    11 NULL D5896D37-1BFC-4F6E-B0FB-11D47C8C7A38 FRGG's story 468CBAF4-8755-45D8-9243-15F6B7507E48
    12 NULL 5E84C2CE-6E8A-4094-B911-314E15E46F95 FRDD's story 80CDD92D-16F4-4BD1-ACED-1F0E88E4050A
      

  11.   

    sorry, 应该把中间DirName = t.DirName去掉.
    ==>update table1
    set PagePre = (select titlecode from table1
    where titleid = 
    (select max(titleID) from table1 where DirName = t.DirName AND titleid < t.titleid))
    from table1 t
      

  12.   

    to:Generics 我对你的敬仰犹如滔滔江水连绵不绝,犹如黄河泛滥一发不可收拾...仔细研究下结贴 :)再次表示谢谢!
      

  13.   

    刚才在.net版玩,没看到...
    借用 Generics 的测试数据
    我将字段改了一下,方便我看替换后的结果是否正确.
    create table table1
    (    TitleID int Identity(1,1) not null,
        Title    varchar(200) null,
        TitleCode varchar null,
        DirName varchar(100) null,
        PagePre varchar null
    )insert table1 (TitleCode, DirName)
    select 'a', 'FRJJ''s story'
    union all select 'b', 'FRMM''s story'
    union all select 'c', 'FRGG''s story'
    union all select 'd', 'FRDD''s story'
    union all select 'e', 'FRJJ''s story'
    union all select 'f', 'FRMM''s story'
    union all select 'g', 'FRGG''s story'
    union all select 'h', 'FRDD''s story'
    union all select 'i', 'FRJJ''s story'
    union all select 'j', 'FRMM''s story'
    union all select 'k', 'FRGG''s story'
    union all select 'l', 'FRDD''s story'update a set PagePre=b.TitleCode
    from table1 a
    left join table1 b
    on a.DirName=b.DirName and a.titleID>b.titleID
    and not exists(select 1 from table1 c where c.dirname=a.dirname and c.titleID>b.titleID and c.titleID<a.TitleID)select * from table1
    drop table table1/*
    1 NULL a FRJJ's story NULL
    2 NULL b FRMM's story NULL
    3 NULL c FRGG's story NULL
    4 NULL d FRDD's story NULL
    5 NULL e FRJJ's story a
    6 NULL f FRMM's story b
    7 NULL g FRGG's story c
    8 NULL h FRDD's story d
    9 NULL i FRJJ's story e
    10 NULL j FRMM's story f
    11 NULL k FRGG's story g
    12 NULL l FRDD's story h*/
      

  14.   

     Generics 的第一种方法的效率最高,虽然SQL对一些,个人以为这个好。 8秒
      Generics 的2方法 要 12秒 fcuandy 的结果也正确的,感觉速度稍微慢点,我的5k多记录要14秒谢谢各位的热心帮助。很快结贴。
      

  15.   

    not exists 跟 max聚合比,当然会差一些了.如果是 exists 那会依赖于匹配度,应该会快很多,不过这里不能用exists. hehe如果将 not exists(select 1..
    改为 b.titleID=(select max(titleid) from table1 where ... /*取小于a.titleid的最大的那个*/)
    那也就一样了.
      

  16.   

    或者直接将 max(dirname相同,但titleid小于a.titleid的记录的titleid) 作为 b 行集, 然后用 a 左连, 效率更高.
    update a set pre=b.code
    from table1 a
    left join
    (select max(titleid) ..where.. ) b这...,写法就又成一样的了,哈哈.