2009年12月2日 星期三

T-SQL 剔除重複資料

去除重複資料,在資料庫的查詢語法裡,算是很常見的一種需求,用膝蓋想,Distinct 這名詞就浮出來了。然而,T-SQL 沒辦法讓你指針對某個欄位去作 Distinct ,舉例說,如果你有三個欄位,則 T-SQL 的 Distinct 就會針對這三個欄位一起去作判斷,你不能限定他針對某一個或某幾個欄位來判斷。如果遇到這種情況時,我的膝蓋就想不出直接的方法了。

我用一段程式來說明:

create table #tmp 
( t_id int IDENTITY(1,1) NOT NULL,
t_name nvarchar(50),
t_login_date nvarchar(8))

insert into #tmp (t_name,t_login_date) values ('paladin','20091201')
insert into #tmp (t_name,t_login_date) values ('paladin','20091201')
insert into #tmp (t_name,t_login_date) values ('paladin','20091205')
insert into #tmp (t_name,t_login_date) values ('hugo','20091001')
insert into #tmp (t_name,t_login_date) values ('hugo','20091001')
insert into #tmp (t_name,t_login_date) values ('hugo','20091021')

我建立了一個暫存表 #tmp , 有三個欄位 t_id , t_name, t_login_date
同時塞了6筆預設值給他。

今天我希望查詢結果能夠包含這三個欄位的資訊,但如果 t_name, t_login_date 有重複時,只要保留一筆就好。

遇到這情況時,最簡潔的方式,就是使用 group by 來完成。我們可以把 t_name, t_login_date 當成 group by 的選項,這樣挑選後的結果,就不會有 t_name 與 t_login_date 重複現象發生。但為了要能夠讓 t_id 欄位資訊也能夠保留,剛好目前也還欠 group by 一個交待,就是使用 group by 時要包含一個彙總函數 ,所以可以用 max( t_id ) 或 min( t_id ) 來使用,而查詢語法如下:

select max(t_id) t_id,t_name,t_login_date from #tmp
group by t_name,t_login_date

因為彙總函數結果欄位的欄位名稱會被視為[沒有資料行的名稱],所以我又再透過 alias 別名方式重新指定他的資料行名稱為 t_id。而執行後的結果正是我所需要的方式。


沒有留言:

張貼留言