新增不存在記錄的3種方法

2021-04-18 16:31:53 字數 2750 閱讀 1846

當我們a表、b表都包含相同資訊(如使用者資訊),現在需要向a表插入在b表中不存在的紀錄。我們有3種常見的方法來完成

1 insert a

select * from b

where id not in (select id from a)

2 insert a

select * from b

where not exists(select 1 from a where a.id=b.id)

3 select b.* from b

left join a on a.id=b.id

where a.id is null

讓我們來看看測試
-- 原始資料表

create table #source_user (userid int, username varchar(20))

-- 目標表

create table #mid_user (userid int, username varchar(20))

-- 為兩表建立索引

create unique clustered index ix_temp_source_user_userid on #source_user(userid);

create unique clustered index ix_temp_mid_user_userid on #mid_user(userid);

-- 建立5萬測試資料,其中為目標表建立id小於2萬的使用者

declare @i int

set @i = 1

while @i < 50000

begin

insert #source_user

select @i, 'user '+convert(varchar,@i)

if @i < 20000

insert #mid_user

select @i, 'user '+convert(varchar,@i)

set @i = @i + 1

enddeclare @t1 datetime

-- 1 使用 not in 模式插入

-- 實際執行計畫:估計子樹大小6.637(無索引), 6.19(有索引)

-- 有索引模式下執行時間(秒) 02.750

begin tran

set @t1 = getdate()

insert #mid_user

select userid, username

from #source_user s

where userid not in (select userid from #mid_user)

print convert(varchar(32), getdate()-@t1, 121)

rollback

-- 2 使用 not exists 模式插入

-- 實際執行計畫:估計子樹大小1.43627(無索引), 0.688897(有索引)

-- 有索引模式下執行時間(秒) 0.432

begin tran

set @t1 = getdate()

insert #mid_user

select userid, username

from #source_user s

where not exists(select 1 from #mid_user r where r.[userid]=s.[userid])

print convert(varchar(32), getdate()-@t1, 121)

rollback

-- 3 使用 left join where m.userid is null 模式插入

-- 實際執行計畫:估計子樹大小1.48(無索引), 0.788897(有索引)

-- 有索引模式下執行時間(秒) 0.432

begin tran

set @t1 = getdate()

insert #mid_user

select s.userid, s.username

from #source_user s

left join #mid_user m on s.userid=m.userid

where m.userid is null

print convert(varchar(32), getdate()-@t1, 121)

rollback

-- 檢查資料

select count(1) from #source_user

select count(1) from #mid_user

select * from #source_user

select * from #mid_user

-- 刪除測試資料

-- drop index ix_temp_source_user_userid on #source_user

-- drop index ix_temp_mid_user_userid on #mid_user

drop table #source_user

drop table #mid_user

根據結果,我們可以看到,使用第2種方法最快:not exists

select userid, username

from #source_user s

where not exists(select 1 from #mid_user r where r.[userid]=s.[userid])

static修飾的方法不存在重寫

static修飾的方法 子父類中同名同參的方法要麼都被static修飾,要麼都不被static修飾。被static修飾的不會構成方法的重寫。靜態方法不存在重寫 public class demo02 class apublic voidb public static voidc class bext...

sql語句中用as新增不存在的字段

ps 本人親測,阿里雲2核4g5m的伺服器價效比很高,新使用者一塊多一天,老使用者三塊多一天,最高可以買三年,感興趣的可以戳一下 阿里雲折扣伺服器 sql語句中,用as可以重新改變返回的列的列名,如 select id from table1.但是如果你不想叫id了,就可以重新命名,如叫 syste...

使用AO新增記錄的3種方法

內容摘要 在向table featureclass 中新增記錄的時候有幾種可供選用的插入方法 他們在不同的使用環境中效率不同 過程描述 1 store 方法 使用irow ifeature 的store 由itable 或 ifeatureclass 的 createrow createfeatur...