3

2 つの文字フィールドを持つテーブル region_town_names があります。1 つは地域名を含み、もう 1 つはコンマで区切られた町のリストです。

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

また、各地域/町の数値 ID を持つ 2 つのテーブル (region_id と town_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が2つのリージョンにどのように属しているかに注目してください。出来ますか?

また、モデルを単純化してテーブルを削除し、次のようregion_town_idsにテーブルを作成できると思います。town_id

(id, region_id, name)
于 2013-02-21T13:01:21.430 に答える