PostgreSQL 兼容Oracle insert first

在Oracle中我们经常使用insert all和insert first来实现多表插入的功能。虽然在pg中并不支持同样的语法,但是我们使用pg的CTE语法来实现相同的功能。

insert first和insert all最大的区别在于凡是符合第一个条件的就都插入第一个表,其他的数据才在以后的条件里再判断。
(关于insert all的用法和兼容方法见:PostgreSQL多表插入(兼容oracle insert all)

Oracle insert first例子:

下面我们先通过Oracle里面的例子来看看insert first的用法:

构建两张空表emp1和emp2,表结构和emp表一致(scott用户下面)

执行下面SQL进行insert first插入:

insert first when job in
  ('SALESMAN', 'MANAGER') THEN INTO emp1
  (empno, ename, job)
values
  (empno, ename, job) when deptno in
  ('20', '30') THEN INTO emp2
  (empno, ename, deptno)
values
  (empno, ename, deptno)
  select empno, ename, job, deptno from emp;

查看:
–emp1表:
在这里插入图片描述

–emp2表:
在这里插入图片描述

可以看到通过insert first语句,第一个表中的EMPNO=7654的数据在第二个表中便不存在了,
因为使用insert fisrt语句:当第一个表符合条件后,第二个表便不插入对应的行。

PostgreSQL兼容方法:

在pg中我们使用CTE语法来实现同样的功能:

with tmp as (SELECT empno,ename,job,deptno from emp),
      tmp1 as (insert INTO emp1
  (empno, ename, job)
  select empno, ename, job from tmp where job in ('SALESMAN', 'MANAGER'))
insert INTO emp2
  (empno, ename, deptno)
  select empno, ename, deptno
    from tmp
   where deptno in ('20', '30')
     and job not in ('SALESMAN', 'MANAGER');

查看pg中数据:
–emp1表:

bill=# select * from emp1;
 empno | ename  |   job    | mgr | hiredate | sal | comm | deptno
-------+--------+----------+-----+----------+-----+------+--------
  7499 | ALLEN  | SALESMAN |     |          |     |      |
  7521 | WARD   | SALESMAN |     |          |     |      |
  7566 | JONES  | MANAGER  |     |          |     |      |
  7654 | MARTIN | SALESMAN |     |          |     |      |
  7698 | BLAKE  | MANAGER  |     |          |     |      |
  7782 | CLARK  | MANAGER  |     |          |     |      |
  7844 | TURNER | SALESMAN |     |          |     |      |
(7 rows)

–emp2表:

bill=# select * from emp2;
 empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+-------+-----+-----+----------+-----+------+--------
  7369 | SMITH |     |     |          |     |      |     20
  7788 | SCOTT |     |     |          |     |      |     20
  7876 | ADAMS |     |     |          |     |      |     20
  7900 | JAMES |     |     |          |     |      |     30
  7902 | FORD  |     |     |          |     |      |     20
(5 rows)

猜你喜欢

转载自blog.csdn.net/weixin_39540651/article/details/114303683