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

  • 相关阅读:
    Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTCTime)、文件时间(FileTime)之间的转换
    VS2008驱动开发环境配置
    delete和delete[]的区别
    手动加载NT式驱动(非工具)修改注册表实现
    结构体的内存空间分配原理
    NT式驱动的卸载
    NT式驱动的安装
    struct tm>time() localtime() gmtime()
    64位驱动数字签名
    SQL Server 数据库错误修改
  • 原文地址:https://www.cnblogs.com/minisculestep/p/4882756.html
Copyright © 2011-2022 走看看