PGSQL - 在复杂条件下加入两个表

时间:2013-05-15 12:47:14

标签: postgresql join subquery data-migration

我在PostgreSQL上进行数据库迁移时遇到困难,需要你的帮助。

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

我需要在替换时加入他们(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'子句中的子查询中可能存在问题。如果你们能帮助我解决这个问题,或者至少指出我正确的方向,我会非常感激。

提前致谢, 扬

2 个答案:

答案 0 :(得分: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 query performance variations
Difference between LIKE and ~ in Postgres
speeding up wildcard text lookups

答案 1 :(得分:0)

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

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