當我們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...