需要将3个sql语句组合成1个

时间:2015-11-26 15:39:30

标签: sql postgresql union

我有3个SQL语句,我想组合成一个,所以我不必从我的程序(java)向我的数据库发出多个请求。 我的DB是PostgreSQL 9.4

首先在umgmt_users

中创建一个新用户
INSERT INTO umgmt_users ("user") VALUES ('test1')

第二个获取该用户的id(db是postgres,id数据类型是serial,因此它会自动分配给我/ programm不知道用户将获得什么ID

SELECT umgmt_users.id
FROM umgmt_users
WHERE umgmt_users.user = 'test1'

Thrird是将刚刚创建的用户的id(我需要第二个语句)和其他一些值添加到另一个表中

INSERT INTO
umgmt_user_oe_fac_role ("user_id", "oe_id", "fac_id", "role_id")
VALUES ('ID OF USER test1 created in first statement', '1', '2', '1');

有没有办法将所有三种语句合二为一?

  1. 创建用户
  2. 查找已分配的ID
  3. 将其ID +其他值插入不同的表格
  4. 我对SQL不是很擅长,我试图在select中加上括号并将其放入insert&还看了UNION和WITH但是无法让它工作......

    编辑:结束使用a_horse_with_no_name

    中的此解决方案
    with new_user as (
       INSERT INTO umgmt_users ("user") VALUES ('test1')
       returning id
    ) 
    INSERT INTO umgmt_user_oe_fac_role (user_id, oe_id, fac_id, role_id)
    SELECT id, 1, 2, 1
    FROM new_user;
    

2 个答案:

答案 0 :(得分:1)

您只需要两个插页:

INSERT INTO umgmt_users ("user") VALUES ('test1');
INSERT INTO umgmt_user_oe_fac_role (user_id, oe_id, fac_id, role_id)
VALUES (lastval(), 1, 2, 1);

为了使lastval()正常工作,两个插入之间必须没有其他语句,并且具有才能在单个事务中运行(因此需要关闭自动提交)

或者,您可以使用数据修改CTE,然后将其作为单个语句执行:

with new_user as (
   INSERT INTO umgmt_users ("user") VALUES ('test1')
   returning id
) 
INSERT INTO umgmt_user_oe_fac_role (user_id, oe_id, fac_id, role_id)
SELECT id, 1, 2, 1
FROM new_user;

请不要将数字用单引号括起来。

答案 1 :(得分:-2)

答案是:将这些组合成一个普通的ANSI SQL语句是不可能的。

第一个和第三个完全讨论两个不同的表格。 第二个是Select语句,它是与其他两个语句不同的语句类型。