0

我在 PostgreSQL 上的数据库迁移过程中卡住了,需要您的帮助。

我有两个需要加入的表:drzewa_mateczne.migracja(我需要迁移的数据)和 ibl_as.t_adres_lesny(我需要加入 migracja 的字典)。

我需要加入他们的 replace(drzewa_mateczne.migracja.adresy_lesne, ' ', '') = replace(ibl_as.t_adres_lesny.adres, ' ', '')。但是我的数据不是很规则,所以我想在第一次与字典匹配时加入它。

我创建了以下查询:

select
count(*)

from
drzewa_mateczne.migracja a

where
length(a.adresy_lesne) > 0
and replace(a.adresy_lesne, ' ', '') = (select substr(replace(al.adres, ' ', ''), 1, length(replace(a.adresy_lesne, ' ', ''))) from ibl_as.t_adres_lesny al limit 1)

该查询不返回任何行。如果没有运行,它确实会成功加入空行

length(a.adresy_lesne) > 0

以下两个查询返回行(如预期的那样):

select replace(adres, ' ', '') 
from ibl_as.t_adres_lesny
where substr(replace(adres, ' ', ''), 1, 16) = '16-15-1-13-180-c'
limit 1


select replace(adresy_lesne, ' ', ''), length(replace(adresy_lesne, ' ', '')) 
from drzewa_mateczne.migracja
where replace(adresy_lesne, ' ', '') = '16-15-1-13-180-c'

我怀疑我的查询中的“where”子句中的子查询可能存在问题。如果你们能帮助我解决这个问题,或者至少为我指明正确的方向,我将非常感激。

在此先感谢,扬

4

2 回答 2

1

您可以在很大程度上简化为:

SELECT count(*)
FROM   drzewa_mateczne.migracja a
WHERE  a.adresy_lesne <> ''
AND    EXISTS (
   SELECT 1 FROM ibl_as.t_adres_lesny al 
   WHERE  replace(al.adres, ' ', '')
    LIKE (replace(a.adresy_lesne, ' ', '') || '%')
   )
  • a.adresy_lesne <> ''和 一样length(a.adresy_lesne) > 0,只是更快。
  • EXISTS半连接替换相关子查询(每行只获得一个匹配项)。
  • 用简单的LIKE表达式替换复杂的字符串构造。

这些相关答案中有关模式匹配和索引支持的更多信息:
PostgreSQL LIKE 查询性能变化
Postgres 中 LIKE 和 ~ 之间的差异
加速通配符文本查找

于 2013-05-15T13:53:37.993 回答
0

您基本上告诉数据库要做的是从 drzewa_mateczne.migracja 中获取具有非空 adresy_lesne 字段的行数,该字段是半随机 ibl_as.t_adres_lesny 行的 adres 字段的前缀...

丢失子查询中的“limit 1”并将“=”替换为“in”,看看这是否是你想要的......

于 2013-05-15T13:05:52.277 回答