2013-02-21 62 views
3

我有两个字符字段的表region_town_names转换名归的数字标识符的名称和串,一个包括区的名字,其他的用逗号分隔的城镇名单的Postgres 8.4.3:如何使用UNNEST

region | towns 
------------------------------- 
regionA | townA, townB, townC  
regionB | townB, townD 

我也有两个表(REGION_ID和town_id)与每个区域/镇的数字标识符

id | name        id | name 
---------------       ---------------- 
1 | regionA       1 | townA 
2 | regionB       2 | townB 
             3 | townC 
             4 | townD 

现在我试图填补这应该UNNEST镇名单的标准化表格region_town_ids和包含的ID像这样的地区和城镇:

region_id | town_id 
------------------- 
    1  | 1 
    1  | 2 
    1  | 3 
    2  | 2 
    2  | 4 

我能esaily得到的名称和与

insert into region_town_ids 
    select region as region_id, unnest(string_to_array(towns,', ')) as town_id 
    from region_town_names; 

插入他们,但我怎么能查找名字的ID在同一语句并插入他们,而不是名字?那可能吗?我需要一个psql函数吗?谢谢。

回答

1

SQL Fiddle

select 
    rid.id region_id, 
    tid.id town_id 
from 
    (
     select 
      region region_name, 
      unnest(string_to_array(towns,', ')) town_name 
     from region_town_names 
    ) rtn 
    inner join 
    region_id rid on rid.name = rtn.region_name 
    inner join 
    town_id tid on tid.name = rtn.town_name 

这个回答你的问题,但我怀疑你得到它错了。请注意town_id#2属于两个区域。可能吗?

而且我认为你可以简化模型消除region_town_ids表,使得town_id表是这样的:

(id, region_id, name) 
+0

非常感谢您!我知道这个例子中两个地区的重复城镇看起来很奇怪,但实际上我使用的是不同类型的数据,这种重复是很常见的,地区/城镇只是作为例子。不幸的是,数据库的结构是固定的,所以我不能改变它。 – Guit 2013-02-22 07:48:02