zoukankan      html  css  js  c++  java
  • 多表插入语句

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

    ①无条件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的实质就是把不同列的数据插入到同一个表的不同行中。

  • 相关阅读:
    in_array()和explode()的使用笔记
    写sql语句连接的时候注意的一个小细节
    在thinkphp框架模板中引用session
    查询数据库所有(某个)表中字段名,数据类型,说明等,导出数据字典
    (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
    判断当前线程所处的状态 (转)以及终止当前线程
    string 字符串的分隔处理与list的相互转换
    C# 动态调用webservice
    C#中的List<string>泛型类示例
    命名空间"system.web"中不存在类型或命名空间名称security"
  • 原文地址:https://www.cnblogs.com/minisculestep/p/4882756.html
Copyright © 2011-2022 走看看