有个公司向我们的学生出了个有关于数据库的面试题,分析了一下,总共整出来两条解决方案,和大家分享分享
题:两张表 create table tbA(aid int,dis int) create table tbB( bid int,com int)
求 tbB表 根据bid的分组,求com的和的 结果 填充到tbA的dis中,条件是 tbA的aid 与tbB的bid 相等
解决问题思路一:
游标能做到快速遍历,优点:读取速度快,效率高
对tbB表的bid分组,求com的和 将这个结果集遍历,然后当tbA的aid与 这个结果集的bid相等的时候,就对tbA的dis 字段进行修改
declare @id int ---定义变量1
declare @sum int ---定义变量2
declare cu_test cursor ---定义一个游标
for
select bid,sum(com) from tbB group by bid --对tbB表的bid分组,求com的和
open cu_test --------打开游标
fetch next from cu_test into @id,@sum ------取游标的第一行数据到变量@id,@sum中
while(@@fetch_Status=0) --只要游标的读取状态为0,就继续循环
begin
update tbA set dis=@sum where aid=@id
fetch next from cu_test into @id,@sum
end
close cu_test ---关闭游标
deallocate cu_test ------也可以删除游标
解决思路二:直接用sql语句来实现,总体是个update,这样做和游标比起来,数据如果很多,效率很显然就低
关于几个结果集以上的不同的数据源(sqlserver)修改模板为:
update table1 set colum1=table2.column
from table1,table2
where table1.column=table2.coulumn ---条件
所以我们的解题思路也出来了:
update tba set dis=tb.com from
(select bid, SUM(com)as com from tbb group by bid) tb,tba
where tba.aid=tb.bid
以上两种思路,仅供参考
顺便再把不同数据源的数据集导入 的 insert into 语句模板做一下备注:
insert into 表名1(列名1,列名1...)
select 列名11,列名22...
from 表名1,表名2
where 条件
结果集存入临时表模板:
select 列名1,列名2,列名3... into #table --临时表
from
结果集