多表插入語句
多表插入語句分為以下四種:
①無條件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的實質就是把不同列的數據插入到同一個表的不同行中。