【问题标题】:One INSERT with multiple SELECT一个 INSERT 和多个 SELECT
【发布时间】:2016-01-09 00:11:16
【问题描述】:

我已经阅读了thisthisthis,但我无法让这个 SQL 工作:

INSERT INTO main_phrase (description) VALUES ('Mot commun féminin pluriel animaux');
/* ERROR: */
WITH
  t1 AS (
    SELECT id 
    FROM main_phrase 
    WHERE description='Mot commun féminin pluriel animaux'
  ),
  t2 AS (
    SELECT id 
    FROM main_groupecategories 
    WHERE description='Mot commun féminin pluriel animaux'
  )
INSERT 
  INTO main_phrasegroupecategories (phrase_id, groupe_categories_id)
  VALUES                           (t1.id,     t2.id);

我明白了:

错误:表 t1 的 FROM 子句缺少条目

我错过了什么?

【问题讨论】:

  • 始终声明您的 Postgres 版本。提供您当前的代码非常有帮助,但也应该有一个简单的英文描述您想要实现的目标。表定义也应该在那里。

标签: postgresql many-to-many sql-insert common-table-expression sql-returning


【解决方案1】:

试试这个:

INSERT INTO main_phrase (phrase_id, groupe_categories_id) 
WITH
  t1 AS (
    SELECT id 
    FROM main_phrase 
    WHERE description='Mot commun féminin pluriel animaux'
  ),
  t2 AS (
    SELECT id 
    FROM main_groupecategories 
    WHERE description='Mot commun féminin pluriel animaux'
  )
  select t1.id, t2.id
  from t1,t2;

【讨论】:

    【解决方案2】:

    假设

    • 您希望将main_phrase 中新插入的行链接到main_groupecategories 中具有相同description 的行。
    • main_phrase.idserial 列。

    错误说明

    您不能在独立的 VALUES 表达式中引用任何表(包括 CTE),您必须将 SELECTFROM 子句一起使用。但是有一个更好的解决方案。见下文。

    更好的查询

    改用data-modifying CTE 以使整个操作更短、更安全、更快捷:

    WITH p AS (
       INSERT INTO main_phrase (description)
       VALUES ('Mot commun féminin pluriel animaux')  -- provide description once
       RETURNING id, description  -- and reuse it further down
       )
    INSERT INTO main_phrasegroupecategories (phrase_id, groupe_categories_id)
    SELECT p.id, g.id
    FROM   p
    JOIN   main_groupecategories g USING (description);
    

    如果您想使用新行的任何值,请立即将它们与另一个 RETURNING 子句一起返回到第二个 INSERT

    为什么在您的(假定的)many-to-many relationship 的两个表中冗余地使用相同的description?可能是您的数据库设计中的问题。

    相关:

    【讨论】:

    • 这在我的设计中不是问题:短语=英语句子。所有的单词都被分成许多类别,我只需要根据“类别组”生成句子(生成有趣的句子)。但有时只有一个词“单独”,所以我需要一个句子 = 短语,它只有这个词所属的“类别组”,所以我仍然可以用这个词做点什么。
    • 这个语法对我来说很新,感觉很强大,但是当你想做这么简单的日常操作的时候就有点大材小用了。非常感谢您的帮助!
    • 查看各种可能的 SQL 语句,这对我来说似乎是最简单可能的方式 - 除了其他优势。
    • @ErwinBrandstetter 我已经开始在搜索 pgsql 问题时添加“erwin”这个词,所以我得到了一个很好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    相关资源
    最近更新 更多