一个INSERT具有多个SELECT

时间:2016-01-09 00:11:16

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

我已经阅读了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子句缺少条目

我错过了什么?

2 个答案:

答案 0 :(得分:3)

假设

  • 您希望将main_phrase中新插入的行与main_groupecategories中的行description相关联。
  • main_phrase.idserial列。

错误说明

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

更好的查询

使用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?可能是数据库设计中的一个问题。

相关:

答案 1 :(得分:2)

试试这个:

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;