带插入子查询的SQL更新

带插入子查询的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

在postgresql中,我想做这样的事情

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()