1

データを 3 番目のテーブルに挿入するために使用するクエリで 2 つのテーブルを接続する必要があります (将来、2 つのテーブルを結合するために使用されます)。これらの表では、関連する列のみに言及します。

PostgreSQL バージョン 9.0.5

表 1: data_table

移行されたデータ、約 10,000 行、関連する列:

id (主キー)、

アドレス (アドレスの先頭、2 番目のテーブルと照合する必要がある文字列。このアドレスの長さはさまざまです。)

表 2: 辞書

辞書、約 900 万行、関連する列:

id (主キー)、

アドレス (完全なアドレス、最初のテーブルと一致させる必要がある文字列、可変長も)

正確に何が必要ですか

これらのテーブルを select ステートメントで正しく接続してから、これらを 3 番目のテーブルに挿入する必要があります。必要なのは、これらのテーブルを正常に接続する方法だけです。

私がやりたい方法は、data_table から各アドレスを取得し、data_table.address で始まる辞書の最初のアドレス (編集: アドレス asc 順) と結合することです (辞書内の多くのアドレスが始まるため、レコードを掛けずに)各 data_table.address を使用)。

また、両方のテーブルのアドレスには不規則なスペースが多く含まれているため、おそらく

replace(address, ' ', '') 

それらの両方で(別のアイデアを歓迎します)。ディクショナリには 900 万行あり、サーバーはかなり遅いため、パフォーマンスの問題も発生する可能性があります。

結果は、次のクエリのバリエーションとして表示されます。

select 
data_table.id, dictionary_id
from
data_table, dictionary
where
-conditions-
4

2 に答える 2

2
SELECT DISTINCT ON (1)
       t.id, d.address, d.id
FROM   data_table t
JOIN   dictionary d ON replace(d.address, ' ', '')
                 LIKE (replace(t.address, ' ', '') || '%')
ORDER  BY t.id, d.address, d.id

ORDER BY質問の更新後に更新されます。)それがなければORDER BY、任意の一致を選択しています。
この関連する回答のテクニックの説明:
Select first row in each GROUP BY group?

辞書の関数インデックスにより、これが高速になります。

CREATE INDEX dictionary_address_text_pattern_ops_idx
ON dictionary (replace(address, ' ', '') text_pattern_ops);

そのための詳細な説明は、前置の質問に提供した回答にあります。

それがあなたに「最高の」一致をもたらすかどうかについて議論するかもしれません. 1 つの代替案は、トライグラム インデックスを使用した類似性一致です。最後の質問に追加した最初のリンクの詳細。

于 2013-05-15T17:43:04.920 に答える