【问题标题】:postgres insert using CTE and use the inersted id in next sub querypostgres 使用 CTE 插入并在下一个子查询中使用 inersted id
【发布时间】:2020-05-28 16:29:40
【问题描述】:

我将一个用户插入数据库。然后我需要生成的用户 ID 插入到 teamMember 表中。我正在使用 CTE,我读到它们同时运行,是否可以将插入用户的 id 返回到下一条语句?

    with INPUT (col) as (
        VALUES ('
            {
               "insert":[
                {"username":"JSmith", "name":"John Smith", "mail":"JSmith@smith.com","jobTitle":"Lead","hasImage":true,"teamId":47}
               ],
               "delete":[
               ],
               "update":[{"username":"JDoe", "name":"Jane Doe","mail":"JDoe@mark.com","jobTitle":"Software Developer","hasImage":false, "uid": 255, "teamId":40}]
            }'::jsonb)
    ), 
    -- Insert new users if username is unique
    do_insert as ( 
      INSERT INTO users (username, name, mail, "jobTitle", "hasImage")
      SELECT i.value ->> 'username',
             i.value ->> 'name', 
             i.value ->> 'mail',
             i.value ->> 'jobTitle',
             (i.value ->> 'hasImage')::boolean
      FROM INPUT
       CROSS JOIN json_array_elements(to_json(col -> 'insert')) i
        WHERE NOT EXISTS (
            SELECT (username) FROM users
            WHERE username = i.value ->> 'username' 
        )
        RETURNING *
    )
    -- Insert row in teamMembers
        INSERT INTO "teamMembers"("teamId", "userId")
      select (i.value ->> 'teamId')::int, t1.id
      from input
       cross join json_array_elements(to_json(col -> 'insert')) i
        left join users t1 ON i.value ->> 'username' = t1.username
left join do_insert on users.username = do_insert.username

【问题讨论】:

标签: sql postgresql-9.1


【解决方案1】:

您不需要users 上的左连接,因为do_insert 是同一张表,但已更新。在您的选择中放入 do_insert.id 而不是 t1.id 并摆脱用户离开加入,它应该可以工作。

    with INPUT (col) as (
        VALUES ('
            {
               "insert":[
                {"username":"JSmith", "name":"John Smith", "mail":"JSmith@smith.com","jobTitle":"Lead","hasImage":true,"teamId":47}
               ],
               "delete":[
               ],
               "update":[{"username":"JDoe", "name":"Jane Doe","mail":"JDoe@mark.com","jobTitle":"Software Developer","hasImage":false, "uid": 255, "teamId":40}]
            }'::jsonb)
    ), 
    -- Insert new users if username is unique
    do_insert as ( 
      INSERT INTO users (username, name, mail, "jobTitle", "hasImage")
      SELECT i.value ->> 'username',
             i.value ->> 'name', 
             i.value ->> 'mail',
             i.value ->> 'jobTitle',
             (i.value ->> 'hasImage')::boolean
      FROM INPUT
       CROSS JOIN json_array_elements(to_json(col -> 'insert')) i
        WHERE NOT EXISTS (
            SELECT (username) FROM users
            WHERE username = i.value ->> 'username' 
        )
        RETURNING *
    )
    -- Insert row in teamMembers
        INSERT INTO "teamMembers"("teamId", "userId")
      select (i.value ->> 'teamId')::int, do_insert.id
      from input
       cross join json_array_elements(to_json(col -> 'insert')) i
      left join do_insert on users.username = do_insert.username

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 2022-10-15
    • 2021-09-06
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多