PostgreSQL: невозможно использовать DISTINCT для некоторых типов данных - PullRequest
2 голосов
/ 27 июня 2010

У меня есть таблица с именем _sample_table_delme_data_files, которая содержит несколько дубликатов. Я хочу скопировать свои записи без дубликатов в data_files:

INSERT INTO data_files (SELECT distinct * FROM _sample_table_delme_data_files);
ERROR:  could not identify an ordering operator for type box3d
HINT:  Use an explicit ordering operator or modify the query.

Проблема в том, что PostgreSQL не может сравнивать (или упорядочивать) box3d типы. Как я могу предоставить такой оператор заказа, чтобы я мог получить только различные в моей таблице назначения?

Заранее спасибо,

Адам

Ответы [ 3 ]

2 голосов
/ 27 июня 2010

Если вы не добавите оператор, вы можете попробовать перевести данные box3d в текст, используя его функцию вывода, например:

INSERT INTO data_files (SELECT distinct othercols,box3dout(box3dcol) FROM _sample_table_delme_data_files);

Редактировать Следующий шагis: приведите обратно к box3d:

INSERT INTO data_files SELECT othercols, box3din(b) FROM (SELECT distinct othercols,box3dout(box3dcol) AS b FROM _sample_table_delme_data_files);

(у меня нет box3d в моей системе, поэтому он не проверен.)

2 голосов
/ 27 июня 2010

Тип данных box3d не имеет оператора для операции DISTINCT. Вам нужно создать оператора или спросить у PostGIS-проекта, может быть, кто-то уже исправил эту проблему.

0 голосов
/ 27 июня 2010

Наконец, это было решено коллегой.

Давайте посмотрим, сколько там дуплексов:

SELECT COUNT(*) FROM _sample_table_delme_data_files ;
 count                                                               
-------                                                              
 12728                                                               
(1 row)

Теперь мы добавим еще один столбец в исходную таблицу, чтобы помочь нам дифференцироватьпохожие строки:

ALTER TABLE _sample_table_delme_data_files ADD COLUMN id2 serial;

Теперь мы можем увидеть дуплексы:

SELECT id, id2 FROM _sample_table_delme_data_files ORDER BY id LIMIT 10;
   id   | id2                                                                           
--------+------                                                                         
 198748 | 6449                                                                          
 198748 |   85                                                                          
 198801 |  166                                                                          
 198801 | 6530                                                                          
 198829 |   87                                                                          
 198829 | 6451                                                                          
 198926 |   88                                                                          
 198926 | 6452                                                                          
 199062 | 6532                                                                          
 199062 |  168                                                                          
(10 rows)       

И удалить их:

DELETE FROM _sample_table_delme_data_files 
    WHERE id2 IN (SELECT max(id2) FROM _sample_table_delme_data_files 
                         GROUP BY id 
                               HAVING COUNT(*)>1);

Давайте посмотрим, как это работает:

SELECT id FROM _sample_table_delme_data_files GROUP BY id HAVING COUNT(*)>1;
 id
----
(0 rows)

Удалить вспомогательный столбец:

ALTER TABLE _sample_table_delme_data_files DROP COLUMN id2;
ALTER TABLE

Вставить оставшиеся строки в таблицу назначения:

INSERT INTO data_files (SELECT * FROM _sample_table_delme_data_files);
INSERT 0 6364
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...