多表插入语句

多表插入语句分为以下四种:

①无条件INSERT。

②有条件INSERT ALL。

③转置INSERT。

④有条件INSERT FIRST。

首先创建测试用表:

CREATE TABLE emp(
    empno NUMBER(4),
    ename VARCHAR2(10),
    job VARCHAR2(9),
    deptno NUMBER(2)
);

INSERT INTO emp VALUES(7500, 'A', 'SALESMAN', 10);
INSERT INTO emp VALUES(7501, 'B', 'MANAGER', 20);
INSERT INTO emp VALUES(7502, 'C', 'CLERK', 30);
INSERT INTO emp VALUES(7503, 'D', 'CLERK', 10);
INSERT INTO emp VALUES(7504, 'E', 'SALESMAN', 20);
INSERT INTO emp VALUES(7505, 'F', 'MANAGER', 30);

CREATE TABLE emp1 AS SELECT empno, ename, job FROM emp WHERE 1 = 2;
CREATE TABLE emp2 AS SELECT empno, ename, deptno FROM emp WHERE 1 = 2;

SELECT * FROM emp;

查询语句执行结果如下:

一.无条件INSERT

sql代码如下:

INSERT ALL
    INTO emp1(empno, ename, job) VALUES(empno, ename, job)
    INTO emp2(empno, ename, deptno) VALUES(empno, ename, deptno)
SELECT empno, ename, job, deptno FROM emp WHERE deptno = 10;

SELECT * FROM emp1;
SELECT * FROM emp2;

第一条查询语句的执行结果如下:

第二条查询语句的执行结果如下:

  

因为没有加条件,所以会同时向两个表中插入数据,且两个表中插入的条数一样。

二.有条件INSERT ALL

 sql代码如下:

DELETE emp1;
DELETE emp2;

INSERT ALL
    WHEN job IN ('SALESMAN', 'MANAGER') THEN
    INTO emp1(empno, ename, job) VALUES(empno, ename, job)
    WHEN deptno IN (10, 20) THEN
    INTO emp2(empno, ename, deptno) VALUES(empno, ename, deptno)
SELECT empno, ename, job, deptno FROM emp;

SELECT * FROM emp1;
SELECT * FROM emp2;

第一条查询语句的执行结果如下:

第二条查询语句的执行结果如下:

当增加条件后,就会按条件插入,如EMPNO=7500等数据在两个表中都有。

三.有条件INSERT FIRST

sql代码如下:

DELETE emp1;
DELETE emp2;

INSERT FIRST
    WHEN job IN ('SALESMAN', 'MANAGER') THEN
    INTO emp1(empno, ename, job) VALUES(empno, ename, job)
    WHEN deptno IN (10, 20) THEN
    INTO emp2(empno, ename, deptno) VALUES(empno, ename, deptno)
SELECT empno, ename, job, deptno FROM emp;

SELECT * FROM emp1;
SELECT * FROM emp2;

第一条查询语句的执行结果如下:

第二条查询语句的执行结果如下:

INSERT FIRST语句中,当第一个表符合条件后,第二个表将不再插入对应的行,表emp2中不再有与表emp1相同的数据,这就是INSERT FIRST 与 INSERT ALL的不同之处。

四.转置INSERT

转置INSERT与其说是一个分类,不如算作“INSERT ALL”的一个用法。

创建测试用表:

CREATE TABLE t1 (
    c1 VARCHAR2(10),
    c2 VARCHAR2(10)
);
CREATE TABLE t2 AS
SELECT 'A' AS d1,
       'B' AS d2,
       'C' AS d3
  FROM DUAL;

sql代码如下:

INSERT ALL
    INTO t1(c1, c2) VALUES('1', d1)
    INTO t1(c1, c2) VALUES('2', d2)
    INTO t1(c1, c2) VALUES('3', d3)
SELECT d1, d2, d3 FROM t2;

SELECT * FROM t1;

查询语句执行结果如下:

可以看到,装置INSERT的实质就是把不同列的数据插入到同一个表的不同行中。

posted on 2015-10-15 17:14  奈何作贼  阅读(11063)  评论(0编辑  收藏  举报

导航