2014-01-24 38 views
0

我有一個select語句返回表中的重複項。我現在想要刪除這些重複項。我怎樣才能用ORACLE SQL做到這一點?如何將它轉換爲ORACLE中的DELETE語句?

SELECT 
    c1.name      AS c1name, 
    c2.name      AS c2name, 
    c1.cy_code     AS c1country, 
    c2.cy_code     AS c2country, 
    c1.latitude     AS c1lat, 
    c1.longitude    AS c1long, 
    c2.latitude     AS c2lat, 
    c2.longitude    AS c2long, 
    calc_distance(c1.latitude, 
       c1.longitude, 
       c2.latitude, 
       c2.longitude) AS distance 
FROM city_temp c1, 
    city_temp c2 
WHERE c2.name = c1.name 
    AND c2.cy_code = c1.cy_code 
    AND calc_distance(c1.latitude, c1.longitude, c2.latitude, c2.longitude) = 0 
    AND c1.latitude = c2.latitude 
    AND c1.longitude = c2.longitude; 
+1

只是一句話:鑑於你限制c1.latitude = c2.latitude和c1.longitude = c2.longitude,不是calc_distance(c1.latitude,c1.longitude,c2.latitude,c2.longitude)始終爲零然後? –

+0

好點子! –

+0

此外,該表只有大約8000行,但是當我執行搜索時,它給了我超過10,000行。爲什麼是這樣的,我該如何解決這個問題? –

回答

1

你可以使用一個存在的條款刪除所有行時,等於更高的rowid:

delete from city_temp c1 
where exists 
(
    select * 
    from city_temp c2 
    where c2.name = c1.name 
    and c2.cy_code = c1.cy_code 
    and c2.latitude = c1.latitude 
    and c2.longitude = c1.longitude 
    and calc_distance(c1.latitude, c1.longitude, c2.latitude, c2.longitude) = 0 
    and c2.rowid > c1.rowid 
); 
+0

這與Narendra的查詢有什麼不同嗎?我測試了兩個,你的一個刪除了1148行,而Narendra刪除了1134行。 –

+0

我收回它。我錯過了您的查詢中的一些內容! –

+0

有沒有什麼辦法可以在刪除之前對此進行選擇,以便我可以看到我將要刪除的內容? –

0

使用ROWID,然後才能執行此

DELETE FROM city_temp where rowid in (
      SELECT c1.rowid 
      FROM city_temp c1, city_temp c2 
      WHERE c2.name = c1.name and c2.cy_code = c1.cy_code and calc_distance(c1.latitude, c1.longitude, c2.latitude, c2.longitude)=0 
         and c1.latitude = c2.latitude and c1.longitude = c2.longitude) 
+1

它刪除了所有行:P –

+0

這意味着您的查詢查找重複項未按預期執行。 – San

+0

當然不是,該查詢返回所有行:-) – dnoeth

1

你可以試試這個,如果你可以改變功能calc_distance

DELETE FROM city_temp 
WHERE rowid not in 
(SELECT MIN(rowid) 
FROM city_temp 
WHERE calc_distance(latitude, longitude)=0 
GROUP BY name, cy_code, latitude,longitude 
) 
0

經典的方法來刪除重複行

DELETE FROM table_name A WHERE ROWID > (
SELECT min(rowid) FROM table_name B 
WHERE A.key_values = B.key_values) 

只要插上你的SELECT語句進去。

或者對於大數據集的最終速度 - 您可以將不同數據複製到臨時表中,截斷原始數據,將數據複製回來並刪除臨時表。

相關問題