我需要在查询中连接两个表,我将使用该查询将数据插入第三个表(将来用于连接两个表)。我将仅提及这些表中的相关列。
PostgreSQL 版本 9.0.5
表一:data_table
迁移数据,约 10k 行,相关列:
id(主键),
address(一个地址的开头,我需要与第二个表匹配的字符串。这个地址有不同的长度。)
表2:字典
字典,大约 900 万行,相关列:
id(主键),
地址(完整地址,我需要与第一个表匹配的字符串,以及不同的长度。)
我到底需要什么
我需要在 select 语句中正确连接这些表,然后将它们插入到第三个表中。我所需要的只是一种成功连接这些表的方法。
我想要这样做的方法是从数据表中获取每个地址,并将其与以数据表开头的字典中的第一个地址(编辑:按地址升序排序)连接起来。地址(不乘以记录,因为有很多地址在字典中以每个 data_table.address 开头)。
此外,两个表中的地址都包含大量不规则空格,因此我们可能需要
replace(address, ' ', '')
关于它们(欢迎任何替代想法)。还可能存在一些性能问题,因为字典有 900 万行并且服务器相当慢。
我将结果视为以下查询的一些变体:
select
data_table.id, dictionary_id
from
data_table, dictionary
where
-conditions-
最佳答案
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);
在我提供给 precursing question 的答案中对此有更多解释.
有人可能会争论这是否能让您获得“最佳”匹配。一种替代方法是与三元组索引进行相似性匹配。我添加到您上一个问题的第一个链接中的详细信息。
关于postgresql - 在复杂查询中连接两个表(非统一数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16570597/