PGSQL -在复杂条件下连接两个表



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

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

我需要在replace(drzewa_mateczne.migracja)上加入它们。adres_lesne, '', ") = replace(ibl_as.t_adres_lesny.)地址,'','')。然而,我的数据不是很规则,所以我想在第一次与字典匹配时加入它。

我创建了以下查询:

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'子句内的子查询中可能存在问题。如果你们能帮我解决这个问题,或者至少给我指出正确的方向,我将非常感激。

提前感谢,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和~的区别
加速通配符文本查找

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

去掉子查询中的"limit 1",用"in"代替"=",看看这是不是你想要的…

最新更新