我有一個列經緯度的表。在大多數情況下,該值相當多地延伸超過小數:-81.7770051972473在罕見情況下,值是這樣的:-81.77對於某些記錄。刪除mysql數據庫中的重複項
如何查找重複項並刪除重複項中只有延長超過兩位小數的記錄?
我有一個列經緯度的表。在大多數情況下,該值相當多地延伸超過小數:-81.7770051972473在罕見情況下,值是這樣的:-81.77對於某些記錄。刪除mysql數據庫中的重複項
如何查找重複項並刪除重複項中只有延長超過兩位小數的記錄?
使用一些有創意的substring
,float
和charindex
邏輯,我來了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
,但兩者都應該以相似的方式工作。
不知道如何純粹在SQL中做到這一點。
我已經使用PHP或CFML等腳本語言來解決類似的需求,方法是構建一個查詢來拉動記錄,然後遍歷記錄集並執行一些比較。如果爲true,那麼非常小心地調用另一個函數,傳入記錄ID並刪除記錄。我甚至可能會在表格中留下記錄,但將其他列標記爲isDeleted。
如果你比我更加雄心勃勃,它看起來像這個線程是接近你想要什麼
使用外部的編程語言(的Perl,PHP,Java,彙編...):
如果你想找出一切大於2位精度的某些原因:
select * from database where lat != round(lat,2), or long != round(long,2)