我在数据库中插入一个用户。然后,我需要将生成的用户ID插入到一个叫做 teamMember
表。我是用CTE的,我读到它们是并发运行的,是否可以将插入用户的id返回到下一条语句中?
with INPUT (col) as (
VALUES ('
{
"insert":[
{"username":"JSmith", "name":"John Smith", "mail":"[email protected]","jobTitle":"Lead","hasImage":true,"teamId":47}
],
"delete":[
],
"update":[{"username":"JDoe", "name":"Jane Doe","mail":"[email protected]","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
你不需要在左连接上 users
自从 do_insert
是相同的表,但已更新。在你的选择中把 do_insert.id
而不是 t1.id
并摆脱了用户的左侧加入,它应该工作。
with INPUT (col) as (
VALUES ('
{
"insert":[
{"username":"JSmith", "name":"John Smith", "mail":"[email protected]","jobTitle":"Lead","hasImage":true,"teamId":47}
],
"delete":[
],
"update":[{"username":"JDoe", "name":"Jane Doe","mail":"[email protected]","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