天天看點

excel導入功能中去掉重複資料—解決思路excel導入功能中去掉重複資料—解決思路

今天客戶提出一個問題,能否在産品中2個子系統中的實作所有的excel導入功能過濾掉已有的資料。

我思考了一番,想到了3種大概的解決思路:

1、在插入每條資料的時候,查到對應的表找出是否存在對應的資料,如存在就跳過。

        2、把整個excel檔案的裡的内容存入到一張臨時表中,然後查詢去重并插入到目的表中。select distinct into 或insert into select,這隻是去掉的目前excel表中重複的資料,不過可以和目的表聯合查詢出目的表中不存在的新資料,然後插入目的表中。

        3、給oracle資料庫相應字段(可能多個)增加唯一限制或者對其建立建立唯一的索引,然後程式做對應的異常處理。

何為“重複資料”呢,可能有多個字段或者單個字段影響,和excel檔案本身裡資料重複或者資料庫裡的資料重複,這些就需要根據具體業務而定了。

第一種方法也是很容易想到的,不過一定要考慮性能問題,如果導入的資料很多,勢必會影響性能,再者即使寫這樣的方法,盡可能不要改動源代碼很大為前提,如寫成一個公共方法,直接傳入表名和限制的字段名,盡可能的遵循OOP原則,或者直接先處理好目前excel檔案,把處理好準備要插入資料庫中的資料存入一個List或者其他适合的集合中,最後進行批量的插入,用JDBC或者hibernate或者其他中的批量插入方法,不過這些都不是絕對的,隻是一個解決思路,選哪種都要根據情形而定。

第二種方法看起來稍微有點複雜,适合excel表中的重複資料多,導入資料比較多這種情況。

第三種方法實作起來比較容易,但有些細節要注意,如果2個非主鍵字段判斷是否是“重複資料”,是采用建立索引的形式create unique index還是constraint name_unique unique(字段1,字段2)),都要考慮字段是否為空,都為空的情形,盡管限制是可以為空的,如果都為空限制是不起作用,再者就是代碼出捕獲SQLException或者自己建立的異常,調用方法或者不用調用就能保證業務上這個異常就是隻能由于這個原因抛出此異常,如果捕獲的異常不是自己那個“違反唯一限制”的異常,要将這個異常throw讓外層的try catch處理。而且如果這個導入功能的業務中有“添加”功能,得注意可能添加了重複資料報錯,得想到處理這個客戶體驗問題。再就是添加限制時可能已有資料有所謂“重複”的,可以

select n.*

from RS_ZK_WRITTENINFO n

where (n.PROJECTID, n.IDCARD) in

(select m.PROJECTID, m.IDCARD

from RS_ZK_WRITTENINFO m

group by m.PROJECTID, m.IDCARD

having count(*) > 1)

類似的SQL語句檢視重複的資料,然後把重複出來的資料删除掉,類似這樣的語句:

delete from RS_ZK_WRITTENINFO n

from RS_ZK_WRITTENINFO m group by m.PROJECTID, m.IDCARD

and rowid not in (select min(rowid)

from RS_ZK_WRITTENINFO z

group by z.Projectid, z.IDCARD

然後再加限制就沒問題了。本人根據情況是采用的第三種方法解決這個問題的。

       最後,認真看過的網友們,大神們,如有感覺我這個程式猿有哪個地方說的不對或者不妥或者你有很好的

提議或者建議或點子方法,還望您大恩大德施舍n秒的時間留下你的寶貴文字(留言),以便你,我,還有廣大的程式猿們更快地成長與進步.......

<b>原文位址</b>http://www.bieryun.com/2209.html