有個公司向我們的學生出了個有關於數據庫的面試題,分析了一下,總共整出來兩條解決方案,和大家分享分享
題:兩張表 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
結果集