代码之家  ›  专栏  ›  技术社区  ›  Adam Matan

PostgreSQL:不能对某些数据类型使用DISTINCT

  •  2
  • Adam Matan  · 技术社区  · 15 年前

    _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.
    

    box3d

    提前谢谢,

    亚当

    3 回复  |  直到 15 年前
        1
  •  2
  •   Edmund    15 年前

    如果不添加运算符,可以尝试翻译 box3d 使用其输出函数将数据转换为文本,例如:

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

    编辑 :

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

    )我没有 在我的系统上,所以它未经测试。)

        2
  •  2
  •   Frank Heikens    15 年前

    create the operator ,或者问PostGIS项目,也许有人已经解决了这个问题。

        3
  •  0
  •   Adam Matan    15 年前

    让我们看看有多少DUP:

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

    现在,我们将在源表中添加另一列,以帮助区分类似的行:

    ALTER TABLE _sample_table_delme_data_files ADD COLUMN id2 serial;
    

    我们现在可以看到DUP:

    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