◆紧急求救——用Update语句更新不同字段,语句怎么写?◆

szpcer 2004-04-18 10:14:16
表tb1:
id f1 f2 f3
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
......

表tb2:
fieldName id newVal modifiedDate
f1 1 x1 2004-3-1 08:00:00
f1 1 x1 2004-2-1 16:00:00
f2 3 y3 2004-1-1 18:00:00
......

============================================
问题:表tb2记录了表tb1的修改过程,现在需要根据表tb2中记录的对表tb1的字段的修改,用一条Update语句将表tb1中的相应字段更新,请问该语句怎么写?不能用存储过程,不要用游标!
...全文
107 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2004-04-21
  • 打赏
  • 举报
回复
--处理过程
declare tb cursor local for
select sql=
case
when isnull(a.modifiedDate,b.modifiedDate)<=b.modifiedDate
then 'update db1..tb1 set ['+b.fieldName+']=(select ['
+b.fieldName+'] from db2..tb2 where Guid='''
+b.Guid+''') where Guid='''+b.Guid+''''
else 'update db2..tb2 set ['+a.fieldName+']=(select ['
+a.fieldName+'] from db1..tb1 where Guid='''
+a.Guid+''') where Guid='''+a.Guid+''''
end
from(
select fieldName,Guid,modifiedDate=max(modifiedDate)
from [db1..tb3]
group by fieldName,Guid
)a full join(
select fieldName,Guid,modifiedDate=max(modifiedDate)
from [db2..tb4]
group by fieldName,Guid
)b on a.fieldName=b.fieldName and a.Guid=b.Guid

declare @sql varchar(8000)
open tb
fetch next from tb into @sql
while @@fetch_status=0
begin
exec(@sql)
fetch next from tb into @sql
end
close tb
deallocate tb
hzwm 2004-04-21
  • 打赏
  • 举报
回复
呵呵,学习,学习!
想请教zjcxc(邹建) 兄在数据库方面有几年功力了,咋这么厉害?:)
另:请指点一下数据库学习的方法。
zjcxc 2004-04-21
  • 打赏
  • 举报
回复
你的记录表呢? 因为要根据记录表来改嘛.

记录表至少要有这样的记录:
字段名(记录那个字段被修改)
修改时间
修改的记录id
修改后的值
szpcer 2004-04-21
  • 打赏
  • 举报
回复
通过对db1.tb3 和db2.tb4两个表中的记录比较,可以知道修改后的值到底在tb1还是tb2中:
f1 f2 f3
db1.tb1的Guid1记录为 a1 b1 c1
db2.tb2的Guid1记录为 x1 b1 c1
1.如果表tb3中记录了对f1字段的修改,表tb4中也记录了对f1字段的修改,并且tb4中的修改时间最新,那么修改后的值为x1
2.如果表tb3中记录了对f1字段的修改,表tb4中没有记录对f1字段的修改,那么修改后的值为a1
3.如果表tb4中记录了对f1字段的修改,表tb3中没有记录对f1字段的修改,那么修改后的值为x1
zjcxc 2004-04-21
  • 打赏
  • 举报
回复
说来说去,还是回到原来的问题上.

db1.tb3:
ID fieldName Guid modifiedDate
ID1 f1 Guid1 2004-3-1 08:00:00
ID2 f1 Guid1 2004-2-1 16:00:00
ID3 f2 Guid3 2004-1-1 18:00:00

fileldname+guid 可以确定修改的是tb1中的那条记录
modifiedDate 可以确定那条修改是最新的,用id来定位

但这个字段修改后的最新的值呢?
szpcer 2004-04-21
  • 打赏
  • 举报
回复
对不起,我再说详细点。
假设在北京有台服务器,深圳有台服务器,分别安装了初始是完全一样的数据库db1,db2;db1中有表tb1,db2中有表tb2,由于两地用户可以对db1.tb1及db2.tb2中的数据分别修改,造成了两个表中原来一致的数据不再一致,现在的问题是,我需要在北京根据深圳的数据库的copy(即db2.tb2)直接修改db1.tb1中数据,使之反映两地的最新更新。举例如下:
================================================================
北京db1.tb1 深圳db2.tb2
------------------- --------------------
ID 字段1 字段2 ID 字段1 字段2
原始记录 Guid1 a b Guid1 a b
------------------- --------------------
一段时间后 Guid1 c b Guid1 a d
================================================================
合并后 c d
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
由于两个数据库均有记录记载对某个字段的修改时间,我现在就需要根据这些记录来完成以上所说的要求,不知我的表达清楚了没有?

谢谢zjcxc(邹建) 兄的关注!!!
szpcer 2004-04-21
  • 打赏
  • 举报
回复
db1.tb1的修改记录表为db1.tb3;db2.tb2的修改记录表为db2.tb4
记录表至少要有这样的记录:
字段名(记录那个字段被修改)——db1.tb3.fieldName
修改时间——db1.tb3.modifiedDate
修改的记录id——db1.tb3.Guid
修改后的值——在db1.tb1中Guid=db1.tb3.Guid并且字段名为db1.tb3.fieldName的值
==========================================================================
db1.tb1: |db2.tb2:
Guid f1 f2 f3 |Guid f1 f2 f3
Guid1 a1 b1 c1 |Guid1 x1 b1 c1
Guid2 a2 b2 c2 |Guid2 a2 y2 z2
Guid3 a3 b3 z3 |Guid3 a3 b3 c3
|
db1.tb3: |db2.tb4:
ID fieldName Guid modifiedDate |ID fieldName Guid modifiedDate
ID1 f1 Guid1 2004-3-1 08:00:00 |ID1 f1 Guid1 2004-2-16 08:00:00
ID2 f1 Guid1 2004-2-1 16:00:00 |ID2 f1 Guid1 2004-2-5 16:00:00
ID3 f2 Guid3 2004-1-1 18:00:00 |ID3 f2 Guid3 2004-2-1 18:00:00

谢谢zjcxc(邹建) 兄的关注!!!
zjcxc 2004-04-20
  • 打赏
  • 举报
回复
主要是你的更新没说清楚,我到现在还是没明白你的更新.

szpcer 2004-04-20
  • 打赏
  • 举报
回复
分不够再加!等待!!!
zjcxc 2004-04-19
  • 打赏
  • 举报
回复
dt=max(modifiedDate)
我没有写最大值,而是最大日期的值,这个难道不是最新值吗?
wangqi790202 2004-04-19
  • 打赏
  • 举报
回复
a join(
select fieldname,id,dt=max(modifiedDate)
from tb2
group by fieldname,id
)b on a.id=b.id and a.fieldname=b.fieldname
你的这段写错了,他不是要最大值,而是最新的值
zjcxc 2004-04-19
  • 打赏
  • 举报
回复
修改后字段的值呢?
zjcxc 2004-04-19
  • 打赏
  • 举报
回复
我是问你修改后的值的字段是那个?

修改后字段的最新值可能在表tb1,也可能在表tb2中?????????????

不是tb3,tb4是修改记录吗? 怎么变tb1,tb2了?
szpcer 2004-04-19
  • 打赏
  • 举报
回复
根据两个日志表中的记录,修改后字段的最新值可能在表tb1,也可能在表tb2中,不知说明白没有?
szpcer 2004-04-18
  • 打赏
  • 举报
回复
恳请zjcxc(邹建) 兄再指教,现在我还有一个类似的但更复杂的问题:
=================================================================================
表tb1: |表tb2:
Guid f1 f2 f3 |Guid f1 f2 f3
Guid1 a1 b1 c1 |Guid1 x1 b1 c1
Guid2 a2 b2 c2 |Guid2 a2 y2 z2
Guid3 a3 b3 z3 |Guid3 a3 b3 c3
(备注:tb1.Guid1=tb2.Guid1,tb1.Guid2=tb2.Guid2,tb1.Guid3=tb2.Guid3,...)

表tb3: |表tb4:
fieldName Guid modifiedDate |fieldName Guid modifiedDate
f1 Guid1 2004-3-1 08:00:00 |f1 Guid1 2004-2-16 08:00:00
f1 Guid1 2004-2-1 16:00:00 |f1 Guid1 2004-2-5 16:00:00
f2 Guid3 2004-1-1 18:00:00 |f2 Guid3 2004-2-1 18:00:00
......
=================================================================================
问题:(不同时间在分布数据库中对不同或相同字段的修改再合并的问题)
表tb1和tb3与表tb2和tb4分布于两个相同的数据库中,表tb3记录了表tb1的修改过程,表tb4记录了表tb2的修改过程,现在需要根据表tb3和tb4中记录的对表tb1和tb2的字段的修改,用Update语句将表tb1中的相应字段更新,请问该语句怎么写?不能用存储过程,不要用游标!
yudeliu 2004-04-18
  • 打赏
  • 举报
回复
转换表2的结构就行了
szpcer 2004-04-18
  • 打赏
  • 举报
回复
正在学习,先谢过!
zjcxc 2004-04-18
  • 打赏
  • 举报
回复
--测试

--测试数据
create table tb1(id int,f1 varchar(10),f2 varchar(10),f3 varchar(10))
insert tb1 select 1,'a1','b1','c1'
union all select 2,'a2','b2','c2'
union all select 3,'a3','b3','c3'

create table tb2(fieldName varchar(10),id int,newVal varchar(10),modifiedDate datetime)
insert tb2 select 'f1',1,'x1','2004-3-1 08:00:00'
union all select 'f1',1,'x2','2004-2-1 16:00:00'
union all select 'f2',3,'y3','2004-1-1 18:00:00'
go

--更新处理
update tb1 set
f1=isnull(b.f1,a.f1),
f2=isnull(b.f2,a.f2),
f3=isnull(b.f3,a.f3)
from tb1 a join(
select a.id
,f1=max(case a.fieldname when 'f1' then a.newval end)
,f2=max(case a.fieldname when 'f2' then a.newval end)
,f3=max(case a.fieldname when 'f3' then a.newval end)
from tb2 a join(
select fieldname,id,dt=max(modifiedDate)
from tb2
group by fieldname,id
)b on a.id=b.id and a.fieldname=b.fieldname
group by a.id
)b on a.id=b.id
go

--显示处理结果
select * from tb1
go

--删除测试
drop table tb1,tb2

/*--测试结果
id f1 f2 f3
----------- ---------- ---------- ----------
1 x2 b1 c1
2 a2 b2 c2
3 a3 y3 c3

(所影响的行数为 3 行)
--*/
zjcxc 2004-04-18
  • 打赏
  • 举报
回复
--更新处理
update tb1 set
f1=isnull(b.f1,a.f1),
f2=isnull(b.f2,a.f2),
f3=isnull(b.f3,a.f3)
from tb1 a join(
select a.id
,f1=max(case a.fieldname when 'f1' then a.newval end)
,f2=max(case a.fieldname when 'f2' then a.newval end)
,f3=max(case a.fieldname when 'f3' then a.newval end)
from tb2 a join(
select fieldname,id,dt=max(modifiedDate)
from tb2
group by fieldname,id
)b on a.id=b.id and a.fieldname=b.fieldname
group by a.id
)b on a.id=b.id

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧