我有一个名为_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
类型。我如何提供这样的排序操作符,以便我只能将不同的内容放入目标表中?
提前致谢,
亚当
答案 0 :(得分:2)
数据类型box3d没有DISTINCT操作的运算符。您必须create the operator,或询问PostGIS项目,也许有人已经解决了这个问题。
答案 1 :(得分:2)
如果您不添加运算符,可以尝试使用其输出函数将box3d
数据转换为文本,例如:
INSERT INTO data_files (SELECT distinct othercols,box3dout(box3dcol) FROM _sample_table_delme_data_files);
编辑下一步是:将其强制转回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 :(得分:0)
最后,这是由一位同事解决的。
让我们看看有多少重复:
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