PostgreSQL не удаляет дубликаты - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь удалить дубликаты из моей БД. Это таблица с данными о местоположении для карты. Некоторые точки были введены дважды, и я пытаюсь их удалить.

Это код, который я использовал

delete from test_table a 
using test_table b 
where a.location_x = b.location_x and a.location_y = b.location_y and a.type = b.type and a.ctid < b.ctid;

, и он имеет удалил некоторые дубликаты. Однако я могу видеть на карте, что есть еще несколько дубликатов. Поиск их по их идентификатору действительно показывает, что они имеют одинаковые местоположения x и y, однако они не удаляются сценарием.

это точка на карте, которая отображается дважды enter image description here

Есть идеи, почему это не работает? Спасибо

Ответы [ 3 ]

1 голос
/ 07 марта 2020

Вы уверены, они равны? Это числа с плавающей запятой двойной точности, и они не являются точными . Попробуйте проверить их равенство.

Чтобы избежать подобных проблем, используйте числа произвольной точности или Postgres тип точки .

0 голосов
/ 07 марта 2020

Ваши координаты местоположения являются числами с плавающей точкой. Они, вероятно, отличаются в десятичных разрядах, которые не отображаются вашим браузером данных. Они не подходят для сравнения на равенство. Обычная практика - проверить, достаточно ли они близки.

Попробуйте заменить a.location_x = b.location_x and a.location_y = b.location_y на abs(a.location_x - b.location_x) < 0.0000001 and abs(a.location_y - b.location_y) < 0.0000001

0 голосов
/ 07 марта 2020

Я не понимаю, почему это не работает, однако я бы сделал это следующим образом:

1)

  select a.ctid
  from test_table a 
  where exists
  (select 1 test_table b 
  where a.location_x = b.location_x and a.location_y = b.location_y and a.type = b.type and 
  a.ctid < b.ctid
)

дает идентификаторы, которые будут удалены

и код ниже удаляет их

2)

delete from test_table where ctid in
(
  select a.ctid
  from test_table a 
  where exists
  (select 1 test_table b 
  where a.location_x = b.location_x and a.location_y = b.location_y and a.type = b.type and 
  a.ctid < b.ctid
  )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...