SQL 百萬級兩表資料間更新和新增

2022-03-04 18:13:36 字數 1803 閱讀 9451

例:有表a和表b,兩表資料都過百萬,兩表資料結構一樣,如下**

table a

要實現表a資料對比表b資料,如果name,description,source都相同,更新表b的price為表a的price,且表a的引入時間要大於表b。

想了一整天,試過n多方法。

題外:linq to sql 的update 超過1萬條就會卡爆,所以放棄之。用2.0的原始sql去執行。

個人認為最快捷方式:

1.用游標集合目標表b。

fetch next from [cursor] into @id---id集合

2.用迴圈出來的單個id去找出a表name,description,source都相同的行。

3.查詢出來的表a結果,quotetime倒序,取top 1的price 賦值給表b當前id的price 

4.刪除查詢出來表a結果的所有資料

如此迴圈下,表a就只剩下不相同的資料

5.插入這些不相同的資料。

只用了一次迴圈,就完成兩表資料的更新和新增。

我是用儲存過程實現,附上**,可能更直觀點

view code

忘了,還要新增a表剩下不相同的資料到b裡

insert into a

select * from b

update a from

a,bwhere a.id=b.id

and a.spec=b.spec

1 declare mycursor cursor for

2select id from

[a]3

4open mycursor

5declare @id sysname

6 fetch next from

mycursor into @id

7while(@@fetch_status-0)8

begin

9 ----更新目標表的資料

10 update b set price=(

11select top 1 a.price from a asa12

inner join (

13select

name,description,source,price,quotetime

14from b where id=@id) as

b15 on a.name=b.name

16 and a.description=b.description

17 and a.source=b.source

18order by a.quotetime desc)

19where id=@id

2021 ----刪除源表的相同資料

22 delete a from a asa23

inner join (

24select

name,description,source,price,quotetime

25from b where id=@id) as

b26 on a.name=b.name

27 and a.description=b.description

28 and a.source=b.source

2930 fetch next from

mycursor into @id

31end

32close mycursor

33 deallocate mycursor

sql跨表更新資料

跨表更新資料是我們經常用的乙個操作,特整理一下 原始資料如下,首先是表結構 a dept的初始資料 a emp初始資料 跨表更新sql語句 語句功能,若a emp表中company和a dept中的company相等,更新a emp中deptid 具體寫法一 update e set e.depti...

MySQL百萬級 千萬級資料多表關聯SQL語句調優

mysql百萬級 千萬級資料多表關聯sql語句調優 本文不涉及複雜的底層資料結構,通過explain解釋sql,並根據可能出現的情況,來做具體的優化,使百萬級 千萬級資料表關聯查詢第一頁結果能在2秒內完成 真實業務告警系統優化結果 希望讀者能夠理解sql的執行過程,並根據過程優化,走上自己的 成金之...

MySQL百萬級 千萬級資料多表關聯SQL語句調優

本文不涉及複雜的底層資料結構,通過explain解釋sql,並根據可能出現的情況,來做具體的優化,使百萬級 千萬級資料表關聯查詢第一頁結果能在2秒內完成 真實業務告警系統優化結果 希望讀者能夠理解sql的執行過程,並根據過程優化,走上自己的 成金之路 需要優化的查詢 使用explain 出現了usi...