3

我有一个包含两个字符字段的表 region_town_names,一个包含区域名称,另一个包含逗号分隔的城镇列表

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

我还有两个表(region_id 和 town_id),每个地区/城镇都有数字 id

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

我现在正在尝试填充一个规范化的表 region_town_ids ,它应该取消嵌套城镇列表并包含区域和城镇的 ID,如下所示:

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

我可以很容易地得到名字并将它们插入

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

但是如何在同一语句中查找名称的 ID 并插入它们而不是名称?那可能吗?我需要一个 psql 函数吗?谢谢。

4

1 回答 1

1

SQL小提琴

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)
于 2013-02-21T13:01:21.430 回答