postgresql - 在复杂查询中连接两个表(非统一数据)

标签 postgresql join insert data-migration

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

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/

相关文章:

java - 如何确定 SQL 语句中列名是否必须用引号引用?

php - LEFT JOIN 无法正常工作

mysql - 从 MySQL 中具有不同列的表的多个连接结果中删除重复项

mysql - 如何只连接表而不是行

excel - openxml - 插入一行,移动其他行

ruby-on-rails - Ruby on Rails - DateTime.current 和用户输入时间的处理

sql - Postgresql在不同服务器上的不同查询计划

python - 来自 manage.py 的数据库错误 : "TypeError: invalid postgreSQL type: bigint"

php - Sql – 在列的第一个空单元格中插入值并显示 ID

php - 批量插入 EAV 表示例