2012-01-09 40 views
2

我有一個列經緯度的表。在大多數情況下,該值相當多地延伸超過小數:-81.7770051972473在罕見情況下,值是這樣的:-81.77對於某些記錄。刪除mysql數據庫中的重複項

如何查找重複項並刪除重複項中只有延長超過兩位小數的記錄?

回答

1

使用一些有創意的substringfloatcharindex邏輯,我來了up with this:

delete l1 
from 
    latlong l1 
    inner join (
     select 
      id, 
      substring(cast(latitude as varchar), 0, INSTR(CAST(latitude as varchar))+3, '.') as truncatedLat 
     from 
      latlong 
    ) l2 on 
     l1.id <> l2.id 
     and l1.latitude = cast(l2.truncatedLat as float) 

Before請先運行select *代替delete l1,以確保您正在刪除正確的行。

我應該注意到,這對SQL Server使用我知道存在於MySQL中的函數起作用,但我無法對MySQL實例進行測試,所以可能需要做一些小小的調整。例如,在SQL Server中,我使用了charindex而不是instr,但兩者都應該以相似的方式工作。

1

不知道如何純粹在SQL中做到這一點。

我已經使用PHP或CFML等腳本語言來解決類似的需求,方法是構建一個查詢來拉動記錄,然後遍歷記錄集並執行一些比較。如果爲true,那麼非常小心地調用另一個函數,傳入記錄ID並刪除記錄。我甚至可能會在表格中留下記錄,但將其他列標記爲isDeleted。

如果你比我更加雄心勃勃,它看起來像這個線程是接近你想要什麼

Deleting Duplicates in MySQL

finding multi column duplicates mysql

1

使用外部的編程語言(的Perl,PHP,Java,彙編...):

  • 選擇從數據庫
  • *對於每一行,SELECT * FROM數據庫,在那裏newLat> = ROUND(oldLat ,2)和newLat < round(oldLat,2)+ .01和//與經度相同的標準
  • 根據您選擇的任何標準保留其中一個。如果最低主鍵,按此排序並跳過第一個結果。
  • 刪除其他所有內容。
  • 對於您已刪除的任何記錄,重複跳到此步驟。

如果你想找出一切大於2位精度的某些原因:

select * from database where lat != round(lat,2), or long != round(long,2)