1

我需要在一个查询中连接两个表,我将使用它来将数据插入到第三个表(将来用于连接这两个表)。我将仅提及这些表中的相关列。

PostgreSQL 版本 9.0.5

表 1:data_table

迁移的数据,约 10k 行,相关列:

id(主键),

地址(地址的开头,我需要与第二个表匹配的字符串。这个地址有不同的长度。)

表 2:字典

字典,约 900 万行,相关列:

id(主键),

地址(完整地址,我需要与第一个表匹配的字符串,长度也不同。)

我到底需要什么

我需要在 select 语句中正确连接这些表,然后将它们插入到第三个表中。我所需要的只是一种成功连接这些表的方法。

我想这样做的方法是从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它选择任意匹配。
此相关答案中的技术说明:
选择每个 GROUP BY 组中的第一行?

字典上的功能索引会加快速度

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

在我提供给前导问题的答案中对此进行了更多解释。

人们可能会争论这是否能让你获得“最佳”匹配。一种替代方法是与三元组索引的相似性匹配。我添加到您最后一个问题的第一个链接中的详细信息。

于 2013-05-15T17:43:04.920 回答
0

我们的架构师提出的解决方案是编写一个函数来查找第一个匹配项。

功能:

CREATE OR REPLACE FUNCTION pick_one_address(text)
  RETURNS text AS
$BODY$
DECLARE
  address_query text;
  toFind text;
  found text;
BEGIN

  toFind := (replace($1, ' ', '') || '%');  
  address_query := 'select al.id from dictionary al where replace(al.adres, '' '', '''') like ''' || toFind ||''' limit 1'; 
  EXECUTE address_query into found;
  RETURN found;

RETURN found_address;
END $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

代码可能看起来很奇怪,因为我确实更改了表名以保护我公司的隐私,并且没有提到我用来简化问题的第三个表,但我想它应该足以理解机制。

感谢您的意见@ErwinBrandstetter,@CraigRinger

于 2013-05-22T09:05:43.497 回答