PostgreSQL中的查询类似于Oracle中的insert all

piok6c0g  于 2023-03-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(179)

在Oracle中有一个“全部插入”请求。

INSERT ALL

  INTO mytable1 (empId, name, last_name) VALUES (expr1, expr2, expr_n)

  INTO mytable2 (empId, address) VALUES (o_expr1, o_expr2, o_expr_n)

SELECT * FROM dual;

我如何在一个请求中同样地将记录插入到postgres中呢?我没有任何返回值。

hts6caw3

hts6caw31#

你可以使用一个公共表表达式:

WITH _a AS (
  INSERT INTO mytable1 (empId, name, last_name)
  VALUES (expr1, expr2, expr_n)
), _b AS (
  INSERT INTO mytable2 (empId, address)
  VALUES (o_expr1, o_expr2, o_expr_n)
)
SELECT 'X' AS dummy;

(The final SELECT尝试镜像the Oracle idiom,但您可以忽略它)

pcww981p

pcww981p2#

在这种情况下,即使在Oracle中也没有理由使用Insert Allvalues是在过程块(pl/sql)中定义的变量,它们不是从select后面派生的。因此,在Postgres中没有理由需要一条语句。2在过程块(plpgsql)中插入将完成完全相同的操作。因此

declare ... 
begin
    ...
    insert into mytable1 (empid, name, last_name)
         values (expr1, expr2, expr_n);

    insert into mytable2 (empid, address) 
         values (o_expr1, o_expr2, o_expr_n);
    ...
end;

会做完全相同的事情。而且IMHO比CTE中的DML更容易理解。

注:

正如所写的,这些不会在Oracle或Posrgres中运行。mytable2的插入命名了2个要插入的列,但包含3个值。那些必须匹配。我猜这是一个复制/粘贴错误。

相关问题