2013-02-21 61 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