2008-05-03

請問 SQL 如何顯示重複的資料


問題:

我用 VB + ACCESS 設計購屋貸款的資料庫程式,有一個 TABLE 需用 ID 欄位 (身分證號) 過濾重複資料。假設有 C120012666 有三筆資料,E222272777一筆,使用 SQL 指令「SELECT DISTINCT ID FROM TABLE1」會顯示兩筆資料,也就是 C120012666、E222272777 各一筆。

如果我想抓出「有重複」的資料但過濾「沒有重複」資料,
就是我只要顯示 C120012666 那三筆而不顯示 E222272777 那一筆,請問 SQL 語法有哪種指令可以做到?


回答:

如果你想用一行指令是可以做到的:

select * from Table1 where ID in (select ID from Table1 group by ID having count(ID) >1 )

一行指令就做到看起來很神奇,不過請注意執行速度的問題,因為它對每一筆資料都作了子查詢,想想看如果你的 Table1 有一百萬筆資料,那是多麼可怕的事情!

從系統效益面來看,過濾重複 ID 是一個經常需要處理的狀況,如果先將「select ID, count(ID) as IDCount from Table1 group by ID」這個動作建立一個「Query1」,再用下面的指令來過濾資料就會比較有效率:

select Table1.* from Table1 inner join Query1
on Table1.ID = Query1.ID and Query1.IDCount > 1

這個指令在執行時「Query1」的查詢結果會先建立並且只執行一次,然後這個暫存結果才會與 Table1 作 Inner Join。