2

_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タイプを比較(または順序付け)できないことです。宛先テーブルに個別のみを取得できるように、このような順序付け演算子を指定するにはどうすればよいですか?

前もって感謝します、

アダム

4

3 に答える 3

2

データ型box3dには、DISTINCT操作の演算子がありません。オペレーターを作成するか、PostGISプロジェクトに問い合わせる必要があります。誰かがすでにこの問題を修正している可能性があります。

于 2010-06-27T09:23:03.027 に答える
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ので、テストされていません。)

于 2010-06-27T09:26:00.010 に答える
0

最後に、これは同僚によって解決されました。

dup の数を見てみましょう。

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
于 2010-06-27T11:05:54.227 に答える