Sql 如何从字符串列上的其他两个表填充多对多表
我对SQL很熟悉,但还没有足够的使用它,而且我对PostgreSQL完全陌生 我的问题是,我有两个表,其中一个表有一个包含引用其他表的索引的字符串值的列,这些索引在一个字符串中联接,我想生成第三个表,该表将具有多对多关系的索引 表1:Sql 如何从字符串列上的其他两个表填充多对多表,sql,postgresql,Sql,Postgresql,我对SQL很熟悉,但还没有足够的使用它,而且我对PostgreSQL完全陌生 我的问题是,我有两个表,其中一个表有一个包含引用其他表的索引的字符串值的列,这些索引在一个字符串中联接,我想生成第三个表,该表将具有多对多关系的索引 表1: tags: { id: bigint, tag: character varying(10), connected: character varying(10), meaning: character varying(120),
tags: {
id: bigint,
tag: character varying(10),
connected: character varying(10),
meaning: character varying(120),
CONSTRAINT: tags_pk PRIMARY KEY (id)
}
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)
}
表2:
tags: {
id: bigint,
tag: character varying(10),
connected: character varying(10),
meaning: character varying(120),
CONSTRAINT: tags_pk PRIMARY KEY (id)
}
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,但应该让您了解表的概念
单词.lemmas
包含如下内容:名词:p:m
,其中由拆分的每个部分:
是一个唯一的标记.tag
名称
我想拆分这个引理
列,然后为每个标记名找到标记id
,并用word.id
和tags.id
将一行写入多对多表
有人能给我一些关于如何实现这一目标的建议吗
我曾尝试在pgAdmin中的SQL控制台中编写FOR循环,但它显示“FOR附近的语法不正确”。我不知道如何使用SELECT执行此操作
更新
我试图执行的伪代码仍然无法运行:
CREATE OR REPLACE FUNCTION dummy_function()
RETURNS TABLE
(
word_id bigint,
tag_id bigint
)
AS $$
DECLARE
WORD_ID bigint;
LEMMAS varchar(255)[];
TAG_ID bigint;
BEGIN
FOREACH word IN words LOOP
LEMMAS = string_to_array(QuestionList_, ':')
FOREACH lemma in ARRAY LEMMAS LOOP
-- HERE I want to return word_id and tag_id that I would later insert into relations table
RETURN QUERY word.id, SELECT tags.id FROM tags WHERE tag = lemma
END LOOP
END LOOP
RETURN
END;
$$ LANGUAGE PLPGSQL;
它既方便又相当快。演示
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;
既方便又快捷。演示
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;
@Andreas更新了问题,这就是我现在要做的,它对word循环中的每个单词都不起作用,
其中单词
是一个表格如果语法不正确,你应该检查一下语法规则language@Andreas你能告诉我这个函数是否真的有意义吗?@Andreas更新了这个问题,这就是我现在要做的,它对word循环中的每个单词都不起作用,words
,如果语法不正确,你应该检查一下语法规则language@Andreas你能告诉我这个函数是否真的有意义吗?这使它更快更容易阅读。另外,我的方法中的一些语法问题是代码>在我错过的表达式之后)这使它更快更容易阅读。另外,我的方法中的一些语法问题是代码>在我错过的表达式之后)