一个 INSERT 带有多个 SELECT

Oli*_*ons 3 postgresql many-to-many common-table-expression sql-insert 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);
Run Code Online (Sandbox Code Playgroud)

我得到:

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

我错过了什么?

Jua*_*eza 9

尝试这个:

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;
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 5

假设

  • 您想将新插入的行链接main_phrasemain_groupecategories具有相同description.
  • main_phrase.id是一serial列。

错误说明

你可以不参考任何表(包括CTE)在一个独立的VALUES表达,你将不得不使用SELECT一个FROM子句。但是有一个更好的解决方案。见下文。

更好的查询

改用数据修改 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);
Run Code Online (Sandbox Code Playgroud)

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

为什么description在(假定的)多对多关系的两个表中冗余地相同?可能是您的数据库设计中的问题。

有关的:


归档时间:

查看次数:

6940 次

最近记录:

7 年,10 月 前