在 postgresql 查询中多次使用单个 WITH

use*_*283 5 sql postgresql common-table-expression

如何多次使用我的第一个 with 语句?使用像下面这样的代码,除了紧随其后的语句之外,我不能将它用于任何其他语句。

WITH insertuser AS (

    INSERT INTO 
    zorro.user (username, firstname, lastname,
        accountstatus, roles, creationdatetime)
    VALUES('test', 'test', 'test',
        'test', 'test', current_timestamp)
    RETURNING id
    )

INSERT INTO
zorro.email (address, confirmed, count, user_id)
SELECT 'test', false, 1, id
FROM insertuser;

INSERT INTO
zorro.password (hash, count, user_id)
SELECT 'test', 1, id
FROM insertuser;

INSERT INTO
zorro.phone_number (number, confirmed, count, user_id)
SELECT 'test', false, 1, id
FROM insertuser;

INSERT INTO
zorro.Question (text, answer, count, user_id)
SELECT 'test', 'test', 1, id
FROM insertuser;
Run Code Online (Sandbox Code Playgroud)

我在第 19 行出现 sql 错误,靠近代码中的第二个“FROM insertuser”。

Gor*_*off 3

我认为你可以使用一系列公用表表达式:

WITH insertuser AS (
    INSERT INTO zorro.user (username, firstname, lastname, accountstatus, roles, creationdatetime)
        VALUES('test', 'test', 'test', 'test', 'test', current_timestamp)
     RETURNING id
    ),
    em as (
     INSERT INTO zorro.email (address, confirmed, count, user_id)
         SELECT 'test', false, 1, id
         FROM insertuser
     RETURNING *
    ),
    p as (
     INSERT INTO zorro.password (hash, count, user_id)
         SELECT 'test', 1, id
         FROM insertuser
     RETURNING *
    ),
    pn as (
     INSERT INTO zorro.phone_number (number, confirmed, count, user_id)
         SELECT 'test', false, 1, id
         FROM insertuser
     RETURNING *
   )
INSERT INTO zorro.Question (text, answer, count, user_id)
    SELECT 'test', 'test', 1, id
    FROM insertuser;
Run Code Online (Sandbox Code Playgroud)

我不能 100% 确定RETURNINGCTE 是否需要该条款。