2013-05-15 42 views
0

在PostgreSQL的数据库迁移过程中,我遇到困难,需要您的帮助。PGSQL - 在复杂的条件下连接两个表

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

我需要加入他们替换(drzewa_mateczne.migracja.adresy_lesne,'','')=替换(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'子句。如果你们可以帮我解决这个问题,或者至少让我指向正确的方向,我会非常感激。

由于提前, 扬

+0

这里后续问题:http://stackoverflow.com/questions/16570597/joining -two-tables-in-a-complex-query-not-uniform-data –

回答

0

什么你基本上是告诉数据库做的是让你的行从drzewa_mateczne.migracja有一个非空adresy_lesne场是的前缀计数一个半随机ibl_as.t_adres_lesny行ADRES场...

失去在子查询中的“限制1”,替代“=”与“中”,看看是否是你想要的东西......

+0

我想要第一场比赛,而不是所有的比赛。如果我按照您的建议进行操作,我会在drzewa_mateczne.migracja中的每一行ibl_as.t_adres_lesny中获得多个匹配项。当我找到它的时候,我只需要一次匹配,如果不能,我也只需要一次。 – fetta

+1

但是你只使用子查询进行过滤...... –

+0

你说得对,我还没有意识到这一点。即使它有效,我仍然必须将ibl_as.t_adres_lesny表添加到'from'子句中,以便在select中使用它。 然而,count(*)仍然返回0行,如果当前'where'子句按预期工作,我只需要计算可匹配的行数,对不对? – fetta

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

+0

看起来很整齐,我喜欢它,但ibl_as.t_adres_lesny有9百万行。我已经完成了查询,但是我担心在我离开工作之前它不会完成。 无论如何,正如我发现感谢Wojciech Brudniak,我需要从两个表格中选择数据,而不仅仅是过滤第一个数据。有关如何做到这一点的任何建议? – fetta

+0

是的,我试图避免'LIKE'声明,因为它的速度。我正在慢速服务器上处理9毫米行,查询优化在这里非常重要。 – fetta

+0

@fetta:'LIKE'变种应该相当快*。另外,它可以在替换(al.adres,'','')''后面加上一个功能性'text_pattern_ops'索引来使其*真的很快。请务必阅读我链接到的相关答案中的详细信息。至于你改变的要求:写一个新的问题与确切的细节。一定要包括你的Postgres版本,相关的表格定义和你想要的结果的样本。 –