在PostgreSQL查询中多次使用单个WITH语句

6
我该如何多次使用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;

我在代码的第19行附近遇到了SQL错误,第二个"FROM insertuser"出现了问题。


什么错误被抛出了? - Sachu
1
公共表达式仅适用于一个查询。 - Joe Stefanelli
您可以将结果保存到临时表中并重复使用该临时表。 - Gordon Linoff
1个回答

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;

我不确定是否需要在CTE中使用RETURNING子句。


谢谢。顺便说一句,下一个 RETURNING 子句是不必要的。 - user3550283
@user3550283,你能让这个东西工作吗?我仍然面临问题。 - gsb22
@GauriShankarBadola . . . 你或许应该提出自己的问题。 - Gordon Linoff
@GordonLinoff 实际上我之前就是这样做的,但是SO建议我尝试这个方法。我遇到了完全相同的问题,但是这个方法对我不起作用。 :( - gsb22

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接