带插入子查询的SQL更新
在postgresql中,我想做这样的事情带插入子查询的SQL更新,sql,postgresql,Sql,Postgresql,在postgresql中,我想做这样的事情 update users set salary_account_id = (insert into salary_accounts(some_field) values(1) returning salary_account_id) 我想为用户表中的每个记录创建相应的工资帐户记录,然后用相应的新创建的工资帐户id更新用户表 如果我运行此查询,我会得到一个错误“语法错误位于或接近“into”。您需要使用两个单独的查询。大概是这样的: insert i
update users set salary_account_id =
(insert into salary_accounts(some_field) values(1) returning salary_account_id)
我想为用户表中的每个记录创建相应的工资帐户记录,然后用相应的新创建的工资帐户id更新用户表
如果我运行此查询,我会得到一个错误“语法错误位于或接近“into”。您需要使用两个单独的查询。大概是这样的:
insert into salary_accounts(some_field, user_fk, ...)
select 1, user_uid, .. from users;
update update users u
set salary_account_id = (select salary_account_id from salary_accounts where user_fk = user_uid);
update update users u
set salary_account_id = some_sequence;
insert into salary_accounts(some_field, salary_account_id , ...)
select 1, salary_account_id , .. from users;
或者,如果您在salary\u accounts表中没有用户\u fk,则需要类似以下内容:
insert into salary_accounts(some_field, user_fk, ...)
select 1, user_uid, .. from users;
update update users u
set salary_account_id = (select salary_account_id from salary_accounts where user_fk = user_uid);
update update users u
set salary_account_id = some_sequence;
insert into salary_accounts(some_field, salary_account_id , ...)
select 1, salary_account_id , .. from users;
您需要使用两个单独的查询。大概是这样的:
insert into salary_accounts(some_field, user_fk, ...)
select 1, user_uid, .. from users;
update update users u
set salary_account_id = (select salary_account_id from salary_accounts where user_fk = user_uid);
update update users u
set salary_account_id = some_sequence;
insert into salary_accounts(some_field, salary_account_id , ...)
select 1, salary_account_id , .. from users;
或者,如果您在salary\u accounts表中没有用户\u fk,则需要类似以下内容:
insert into salary_accounts(some_field, user_fk, ...)
select 1, user_uid, .. from users;
update update users u
set salary_account_id = (select salary_account_id from salary_accounts where user_fk = user_uid);
update update users u
set salary_account_id = some_sequence;
insert into salary_accounts(some_field, salary_account_id , ...)
select 1, salary_account_id , .. from users;
两个将两个语句合并为一个,您需要使用CTE:
with inserted as (
insert into salary_accounts(some_field)
values (1)
returning salary_account_id
)
update users
set salary_account_id = (select salary_account_id from inserted)
where ???
您必须添加WHERE子句来限制您要更新的用户,因为我无法想象您要将所有用户更新为相同的
salary\u account\u id
两个将两个语句合并为一个,您需要使用CTE:
with inserted as (
insert into salary_accounts(some_field)
values (1)
returning salary_account_id
)
update users
set salary_account_id = (select salary_account_id from inserted)
where ???
CREATE OR REPLACE FUNCTION CreateSalaryAccount()
RETURNS integer AS $func$
declare
a_id integer;
BEGIN
insert into salary_accounts(some_val) values(1) returning salary_account_id into a_id;
RETURN a_id;
END;
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION UpdateUsersTable()
RETURNS VOID
AS
$$
DECLARE
t_row users%rowtype;
BEGIN
FOR t_row in SELECT * FROM users LOOP
update users
set salary_account_id = CreateSalaryAccount()
where id = t_row.id;
END LOOP;
END;
$$
LANGUAGE plpgsql;
select UpdateUsersTable()
您将添加一个WHERE子句来限制您要更新的用户,因为我无法想象您想将所有用户更新为相同的
工资账户id
您可能应该将插入到函数中,这将执行插入并返回新ID的操作。这不能按书面方式执行。用户
和薪资账户
之间的关系是什么?我无法想象您想将所有用户更改为您刚刚插入的salary\u account\u id。您可能应该将insert
设置为一个函数,该函数将执行插入并返回新id。这不能按书面形式完成。用户
和salary\u account
之间的关系是什么?我无法想象您想将所有用户更改为刚刚插入的salary\u account\u id
CREATE OR REPLACE FUNCTION CreateSalaryAccount()
RETURNS integer AS $func$
declare
a_id integer;
BEGIN
insert into salary_accounts(some_val) values(1) returning salary_account_id into a_id;
RETURN a_id;
END;
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION UpdateUsersTable()
RETURNS VOID
AS
$$
DECLARE
t_row users%rowtype;
BEGIN
FOR t_row in SELECT * FROM users LOOP
update users
set salary_account_id = CreateSalaryAccount()
where id = t_row.id;
END LOOP;
END;
$$
LANGUAGE plpgsql;
select UpdateUsersTable()