Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从字符串列上的其他两个表填充多对多表_Sql_Postgresql - Fatal编程技术网

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

Sql 如何从字符串列上的其他两个表填充多对多表,sql,postgresql,Sql,Postgresql,我对SQL很熟悉,但还没有足够的使用它,而且我对PostgreSQL完全陌生 我的问题是,我有两个表,其中一个表有一个包含引用其他表的索引的字符串值的列,这些索引在一个字符串中联接,我想生成第三个表,该表将具有多对多关系的索引 表1: tags: { id: bigint, tag: character varying(10), connected: character varying(10), meaning: character varying(120),

我对SQL很熟悉,但还没有足够的使用它,而且我对PostgreSQL完全陌生

我的问题是,我有两个表,其中一个表有一个包含引用其他表的索引的字符串值的列,这些索引在一个字符串中联接,我想生成第三个表,该表将具有多对多关系的索引

表1:

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你能告诉我这个函数是否真的有意义吗?这使它更快更容易阅读。另外,我的方法中的一些语法问题是
在我错过的表达式之后)这使它更快更容易阅读。另外,我的方法中的一些语法问题是
在我错过的表达式之后)