SQL與重複記錄

SQL 技術 IT資訊榜中榜 IT資訊榜中榜 2017-09-17

一、查詢表中的重複記錄,並顯示其中一個最大或最小ID號的記錄

方法一:對同一個表,命名兩個名字來實現

select distinct a.id,a.lastname,a.firstname,a.address,a.city from persons as a,persons as b where a.id

這裡講persons表用兩個名稱來命名,分別命名為a表和b表,注意用as關鍵字來重命名。之後用這a表和b表兩個表中的記錄進行是否相等的比較,這裡的相等用一個等號表示“=”,不相等用“!=”或者“<>”表示,大於號用“>”表示,小於號用“<”表示。因為Id的數據類型,我自定義為整形,所以可以比較大小。這裡的id是主鍵,lastname,firstname,address,city都是字段。

方法二:用group BY來實現。

select * from persons where id in(select min(id) from persons group by lastname,firstname,address,city having count(*)>1)

這裡分組的依據是每個字段(除了主鍵ID)之外,通過對每個字段進行相同的值取一個的道理,多個字段就構成的“與”即“and”的意思,所以就是找多個字段都相同的情況,那麼要讓他取一個記錄,就取最大id號碼或者最小ID號碼,分別用函數max(id)和min(id)來獲取,上例中用的是最小id獲取方法。通過以上的例子我們得到在重複記錄中獲取一個記錄的通用方法如下:

select * from 表名 where id in(select min(id) from 表名 group by 重複字段1,重複字段2,。。。,重複字段N having count(*)>1)

後面的having是結合函數COUNT(*),用來判斷統計符合重複記錄的個數的,如果記錄數大於一,就是有重複的。

二、刪除多餘的行,值保留重複記錄中的一個

只留重複記錄中的一個的方法如下,這裡選擇ID號碼最大的號碼(max(id))留下:

delete persons where id not in(select max(id) from persons group by lastname,firstname,address,city),注意這裡不能在後面加having count(*)>1,否則會全部刪除。這裡得到刪除記錄的一般模式:

delete 表名 where id not in(select max(id) from 表名 group by 重複字段1,重複字段2,。。。,重複字段N ) 這裡要靈活應用。

相關推薦

推薦中...