目前是這樣的,批量新增資料時,先與表A排重,不重復的插入到表A中。
MERGE INTO 表A 已有 USING需要再加入一個邏輯:假設收到客戶端提交過來100條資料,完成排重后有20條資料準備要新增到表A中去。現在將這20條記錄再與表B做一下對比,如果記錄存在于B中,給它們標記個記號,日后使用。
(SELECT '1NHXjRVkXVz2geAr12in8AAxK69caE9L41' d
UNION ALL SELECT '1JB4SXTfWPDyw4o1abudfurcPsQ4thJJFg' d
UNION ALL SELECT '1KveoNM2cVPkTpbMeYKGUheenwCcFcyvJc' d
UNION ALL SELECT '19B1tyo63GfVZEp85Kq18vgpYbzNKQE72X' d)
新增 ON(已有.地址=新增.d) WHEN NOT MATCHED THEN INSERT(地址) VALUES(新增.d);
uj5u.com熱心網友回復:
里邊那個新增那里加一個left join b表 把記號一起放進去uj5u.com熱心網友回復:
大概這個意思MERGE INTO 表A 已有 USING
(SELECT temp1.d,b.記號* FROM (SELECT '1NHXjRVkXVz2geAr12in8AAxK69caE9L41' d
UNION ALL SELECT '1JB4SXTfWPDyw4o1abudfurcPsQ4thJJFg' d
UNION ALL SELECT '1KveoNM2cVPkTpbMeYKGUheenwCcFcyvJc' d
UNION ALL SELECT '19B1tyo63GfVZEp85Kq18vgpYbzNKQE72X' d) temp1 LEFT JOIN b ON temp1.col = b.col)
新增 ON(已有.地址=新增.d) WHEN NOT MATCHED THEN INSERT(地址,記號) VALUES(新增.d,新增.記號);
uj5u.com熱心網友回復:
這個順序看上去是先將要插入的資料與B表對比,然后再找A表去重。是嗎?但是B這個表非常大,能否與A表先做去重,再去和B表對比。這樣能快許多。uj5u.com熱心網友回復:
A表欄位:地址(文本),識別(邏輯)B表欄位:地址(文本)
客戶端發來一堆記錄,只包含地址(文本),想要實作:
第一步:先和A表做差集,去掉這堆記錄中已經存在于A表的記錄,
第二部,把第一步結果中的記錄保存到A表中,但是分2種情況,第一種是不存在于B表中,第二種就是B表中也有該記錄。保存時候區別就寫在識別欄位上。
uj5u.com熱心網友回復:
insert into A表(地址,識別)
select 地址=t.d,
識別=case when exists(select 1 from B表 b where b.地址=t.d) then 1
else 0 end
from (select d='1NHXjRVkXVz2geAr12in8AAxK69caE9L41' union all
select d='1JB4SXTfWPDyw4o1abudfurcPsQ4thJJFg' union all
select d='1KveoNM2cVPkTpbMeYKGUheenwCcFcyvJc' union all
select d='19B1tyo63GfVZEp85Kq18vgpYbzNKQE72X') t
left join A表 a on t.d=a.地址
where a.地址 is null
uj5u.com熱心網友回復:
現在將這20條記錄再與表B做一下對比,如果記錄存在于B中,給它們標記個記號,日后使用。可以在資料寫過來的時候,就把記號寫上。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/261546.html
標籤:應用實例
