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不想使用游标,谢谢大家的帮助,给出解决思路,最好能指出我的语句为什么是错误的。再次表示感谢!
[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不想使用游标,谢谢大家的帮助,给出解决思路,最好能指出我的语句为什么是错误的。再次表示感谢!
解决方案 »
- 将出库单中的材料按车间机台再次细分,要汇总到最终所属机台如何实现?
- 用路由器上网,就不能在本地机子上测试连接网上的sql2000服务器的网站了吗?
- 存储过程求解
- 请教存储过程的应用:用A数据库中定义的Cursor如何去访问B数据库中的表?
- 跪求高手,agent(代理)中的邮件配置文件为什么不可用,总是灰的??
- Transaction Log 满了怎么办?
- 数据库置疑,分离不掉,删除出错,附加时提示"错误823",详情见内容,急!!!
- SQL Server 中判断给定日期是星期几的函数是什么?
- ### KingSunSha(弱水三千)进来拿分,问题是:如何有效保护MDB数据库 ###
- 关于dateadd()在sql中的问题
- SQL查询问题
- sql作业成功后,无法查看作业历史
select
*,
(select 1 from table1 where titleid=(select max(titleid) from table1 where titleid<t.titleid))
from
table1 t
计算当前记录前一条记录
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
或
top 1结果集 用别名
再用exists
b.titlecode
from Table1 as b
where b.dirname= '芙蓉姐姐的故事'
and exists (select *
from Table1
where dirname= '芙蓉姐姐的故事' and titleid >b.titleid )
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)再次表示感谢。
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字段
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
==>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
借用 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*/
Generics 的2方法 要 12秒 fcuandy 的结果也正确的,感觉速度稍微慢点,我的5k多记录要14秒谢谢各位的热心帮助。很快结贴。
改为 b.titleID=(select max(titleid) from table1 where ... /*取小于a.titleid的最大的那个*/)
那也就一样了.
update a set pre=b.code
from table1 a
left join
(select max(titleid) ..where.. ) b这...,写法就又成一样的了,哈哈.