如何在字符串列上从其他两个表填充多对多表

时间:2019-07-13 17:27:02

标签: sql postgresql

我对SQL很熟悉,但还没有足够使用它,所以我对PostgreSQL完全陌生。

我的问题是我有两个表,其中一个表的一列包含一个字符串值,该字符串值包含引用其他表的索引,这些表以字符串形式连接,并且我想生成第三个表,该表具有许多索引对多关系。

表1:

tags: {
    id: bigint,
    tag: character varying(10),
    connected: character varying(10),
    meaning: character varying(120),
    CONSTRAINT: tags_pk PRIMARY KEY (id)
}

表2:

words: {
    id: bigint,
    form: character varying(255),
    lemmas: character varying(255),
    original: character varying(255),
    tsv_form_text: tsvector,
    CONSTRAINT words_pkey PRIMARY KEY (id)
}

这些实际上不是SQL,但应该可以让您理解表。

words.lemmas包含以下内容:noun:p:m,其中:分割的每个部件都是唯一的tags.tag名称。

我想拆分此lemmas列,然后为每个标签名称找到标签id,并用word.id和{{1}将行写到多对多表中}。

有人可以给我一些有关如何实现这一目标的建议吗?

我曾尝试在pgAdmin的SQL控制台中编写FOR LOOP,但它在FOR附近显示“语法不正确”。我不知道如何使用SELECT

更新

我试图执行的虚拟代码,但仍然无法运行:

tags.id

1 个答案:

答案 0 :(得分:2)

unnest(string_to_array(..))方便快捷。演示

with words(id, lemmas) as (
  values 
     (1, 'as:df:gh')
    ,(2, 'zx:cv:bn')
), tags(id, tag) as (
  values 
     (11, 'as')
    ,(12, 'df')
    ,(13, 'gh')
    ,(14, 'zx')
    ,(15, 'cv')
    ,(16, 'bn')
)
select w.id wordId, t.id tagId
from (
   select id, unnest(string_to_array(lemmas, E':')) word
   from words
) w
join tags t on t.tag = w.word;

fiddle