sql多表更新问题(在线等待)

wangdongzjk 2003-05-11 08:19:36
有两个数据表:
userclassinfo表,用于记录用户的每一次级别变化,包括初始化纪录,例如class_old=1, class_new=1,表示初始化纪录,例如:
user_id change_class_time class_old class_new
1598 2002-4-1 10:00:00 1 1
2436 2002-5-1 18:34:21 1 1
2590 2002-5-5 13:00:00 1 1
3176 2002-6-12 9:20:00 1 1
3176 2002-10-2 8:00:00 1 2
2590 2002-12-28 6:00:00 1 2
2436 2003-1-10 10:00:20 1 2
1598 2003-2-6 8:00:00 1 2
3176 2003-2-7 6:30:00 2 3
2590 2003-2-8 7:20:00 2 1

BIDS表,其中seller_id和buyer_id是上表中user_id的外键。
bid_id seller_id buyer_id bid_time seller_class buyer_class
52367 3176 1598 2003-2-5 9:15:00
52368 2590 1598 2003-2-6 9:20:00
64427 3176 2436 2003-2-7 13:40:00

在每一个用户参加每一个bid之前,都会在usercalssinfo表中有一个初始化的纪录。
要求:
1、现在需要在bids表中更新两个字段:seller_class,buyer_class。分别表示在bid时seller和buyer的级别(可从上面的userclassinfo中得到)。
2、请用一条SQL语句完成以上任务。
注:在完成上述问题时,可能需要SQL的知识,其中包括:inner/outer join, sub-query, Group-value function, set function等。
...全文
141 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengdali 2003-05-11
  • 打赏
  • 举报
回复
测试:

create table #userclassinfo(user_id int,change_class_time datetime,class_old int,class_new int)
insert #userclassinfo values(1598,'2002-4-1 10:00:00',1,1)
insert #userclassinfo values(2436,'2002-5-1 18:34:21',1 ,1)
insert #userclassinfo values(2590,'2002-5-5 13:00:00',1 ,1)
insert #userclassinfo values(3176,'2002-6-12 9:20:00',1, 1)
insert #userclassinfo values(3176,'2002-10-2 8:00:00',1 ,2)
insert #userclassinfo values(2590,'2002-12-28 6:00:00',1 ,2)
insert #userclassinfo values(2436,'2003-1-10 10:00:20',1, 2)
insert #userclassinfo values(1598,'2003-2-6 8:00:00',1, 2)
insert #userclassinfo values(3176,'2003-2-7 6:30:00',2,3)
insert #userclassinfo values(2590,'2003-2-8 7:20:00',2,1)


create table #BIDS(bid_id int,seller_id int,buyer_id int,bid_time datetime,seller_class int,buyer_class int)
insert #bids values(52367, 3176 ,1598, '2003-2-5 9:15:00',null,null)
insert #bids values(52368, 2590 ,1598 ,'2003-2-6 9:20:00',null,null)
insert #bids values(64427, 3176, 2436 ,'2003-2-7 13:40:00',null,null)

update #BIDS set
seller_class=(select top 1 class_new from #userclassinfo where user_id=#BIDS.seller_id and change_class_time<=#BIDS.bid_time order by change_class_time desc),
buyer_class=(select top 1 class_new from #userclassinfo where user_id=#BIDS.buyer_id and change_class_time<=#BIDS.bid_time order by change_class_time desc)
select * from #bids
go
drop table #userclassinfo,#BIDS
pengdali 2003-05-11
  • 打赏
  • 举报
回复
这个问题,原来答过,是面试用的吧!

update BIDS set
seller_class=(select top 1 class_new from userclassinfo where user_id=BIDS.seller_id and change_class_time<=BIDS.bid_time order by change_class_time desc),
buyer_class=(select top 1 class_new from userclassinfo where user_id=BIDS.buyer_id and change_class_time<=BIDS.bid_time order by change_class_time desc)
new_life 2003-05-11
  • 打赏
  • 举报
回复
---------先建立一个函数
create function f(@v int,@t datetime)
return @r datetime
as
declare @temp
select @temp=sum(change_class_time) from userclassinfo where change_class_time<@t and user_id=@v
return @temp
---------然后再执行这个--------------
update bids set seller_class=a.class_new,buyer_class=b.class_new
from userclassinfo a,userclassinfo b
where seller_id=a.user_id and buyer_id=b.user_id and a.change_class_time=f(seller_id,bid_time) and b.change_class_time=f(buyer_id,bid_time)

=====================================
一句话好像确实实现不了
况且你也说了
注:在完成上述问题时,可能需要SQL的知识,其中包括:inner/outer join, sub-query, Group-value function, set function等。

不也是说要用函数么?
wangdongzjk 2003-05-11
  • 打赏
  • 举报
回复
而且我觉得seller_id=a.userid and buyer_id=b.userid这一句不对。因为bids表中根本不存在seller_id=a.userid and buyer_id=b.userid的情况。但是手工更新的表格结果应该为:
bid_id seller_id buyer_id bid_time seller_class buyer_class
52367 3176 1598 2003-2-5 9:15:00 2 1
52368 2590 1598 2003-2-6 9:20:00 2 2
64427 3176 2436 2003-2-7 13:40:00 3 2
wangdongzjk 2003-05-11
  • 打赏
  • 举报
回复
sql server 提示
服务器: 消息 207,级别 16,状态 3,行 2
列名 'userid' 无效。
服务器: 消息 207,级别 16,状态 1,行 2
列名 'userid' 无效。
服务器: 消息 207,级别 16,状态 1,行 2
列名 'user_id' 无效。
服务器: 消息 207,级别 16,状态 1,行 2
列名 'user_id' 无效。
new_life 2003-05-11
  • 打赏
  • 举报
回复
update bids set seller_class=a.class_new,buyer_class=b.class_new
from userclassinfo a,userclassinfo b
where seller_id=a.userid and buyer_id=b.userid and a.change_class_time=
(select sum(change_class_time) from userclassinfo where change_class_time<bid_time and user_id =seller_id) and
b.change_class_time=
(select sum(change_class_time) from userclassinfo where change_class_time<bid_time and user_id =buyer_id)
----------
你试试
wangdongzjk 2003-05-11
  • 打赏
  • 举报
回复
可是需要一条sql语句啊。
new_life 2003-05-11
  • 打赏
  • 举报
回复
上面是最后版本,我太粗心了,呵呵
new_life 2003-05-11
  • 打赏
  • 举报
回复
---------先建立一个函数
create function f(@v int,@t datetime)
return @r datetime
as
declare @temp
select @temp=sum(change_class_time) from userclassinfo where change_class_time<@t
return @temp
---------然后再执行这个--------------
update bids set seller_class=a.class_new,buyer_class=b.class_new
from userclassinfo a,userclassinfo b
where seller_id=a.userid and buyer_id=b.userid and a.change_class_time=f(seller_id,bid_time) and b.change_class_time=f(buyer_id,bid_time)
new_life 2003-05-11
  • 打赏
  • 举报
回复
---------先建立一个函数
create function f(@v int,@t datetime)
return @r datetime
as
declare @temp
select @temp=sum(change_class_time) from userclassinfo where change_class_time<@t
return @temp
---------然后再执行这个--------------
update bids set seller_class=a.class_new,buyer_class=b.class_new
from userclassinfo a,userclassinfo b
where seller_id=a.userid and buyer_id=b.userid and bid_id=变量 and a.change_class_time=f(seller_id,bid_time) and b.change_class_time=f(buyer_id,bid_time)

wangdongzjk 2003-05-11
  • 打赏
  • 举报
回复
就只更新seller_class和buyer_class两个子段啊,而且就是所有的记录都更新。我想应该是用userclassinfo表中离bids表中的bid_time时间最近的一个记录更新,而且seller_id 和buyer_id应该用userclassinfo表中user_id与他们分别相同的记录来分别更新
new_life 2003-05-11
  • 打赏
  • 举报
回复
更新bids表你总得有个条件吧,难道是所有的记录都更新?
wangdongzjk 2003-05-11
  • 打赏
  • 举报
回复
我说的时间是change_class_time 和bid_time 字段,也就是说前者必须小于后者。
wangdongzjk 2003-05-11
  • 打赏
  • 举报
回复
请问变量代表什么意思?
new_life 2003-05-11
  • 打赏
  • 举报
回复
是效率么?
那这样试试,肯定会快的

select * into #t from userclassinfo

update bids set seller_class=a.class_new,buyer_class=b.class_new
from #t a, #t b
where seller_id=a.userid and buyer_id=b.userid and bid_id=变量
wangdongzjk 2003-05-11
  • 打赏
  • 举报
回复
new_life(浮云游子)更新字段的值需要考虑时间问题
new_life 2003-05-11
  • 打赏
  • 举报
回复
update bids set seller_class=a.class_new,buyer_class=b.class_new
from userclassinfo a,userclassinfo b
where seller_id=a.userid and buyer_id=b.userid and bid_id=变量

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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