Oracle Insert Into Select
在本教程中,您将学习如何使用Oracle INSERT INTO SELECT语句将数据从SELECT语句的结果中插入到表中。
Oracle INSERT INTO SELECT语句概述
有时候,想要将从其它表中并将其到另一个表中。要做到这一点,可使用Oracle INSERT INTO SELECT语句,如下所示:
INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM source_table WHERE condition;
Oracle INSERT INTO SELECT语句要求源表和目标表匹配。
Oracle INSERT INTO SELECT示例
1. 插入所有销售数据示例
下面了演示如何使用insert into select语句,首先创建一个名为sales的表。
CREATE TABLE sales ( customer_id NUMBER, product_id NUMBER, order_date DATE NOT NULL, total NUMBER(9,2) DEFAULT 0 NOT NULL, PRIMARY KEY(customer_id, product_id, order_date) );
以下语句将orders和order_items表中的销售摘要插入到sales表中,参考以下实现语句 -
INSERT INTO sales(customer_id, product_id, order_date, total) SELECT customer_id, product_id, order_date, SUM(quantity * unit_price) amount FROM orders INNER JOIN order_items USING(order_id) WHERE status = 'Shipped' GROUP BY customer_id, product_id, order_date;
以下语句从sales表中检索数据以验证插入结果:
SELECT * FROM sales ORDER BY order_date DESC, total DESC;
执行上面查询语句,得到以下结果 -
2. 插入部分销售数据示例
假设只想将2017年的销售摘要数据复制到新表中。 为此,首先创建一个名为sales_2017的新表,如下所示:
CREATE TABLE sales_2017 AS SELECT * FROM sales WHERE 1 = 0;
WHERE子句中的条件是确保sales表中的数据不会被复制到sales_2017表中。
其次,使用Oracle INSERT INTO SELECT和WHERE子句将2017年的销售数据复制到sales_2017表中:
INSERT INTO sales_2017 SELECT customer_id, product_id, order_date, SUM(quantity * unit_price) amount FROM orders INNER JOIN order_items USING(order_id) WHERE status = 'Shipped' AND EXTRACT(year from order_date) = 2017 GROUP BY customer_id, product_id, order_date;
在此示例中,没有在INSERT INTO子句中指定列列表,因为SELECT语句的结果具有与sales_2017表的列对应的值。 另外,在SELECT语句的WHERE子句中添加了更多的条件,以在2017年仅检索销售数据。
以下查询选择sales_2017表中的所有数据:
SELECT * FROM sales_2017 ORDER BY order_date DESC, total DESC;
执行上面查询语句,得到以下结果 -
3. 插入部分数据和文字值示例
假设,想要发送电子邮件给所有客户告知新产品上市。 要做到这一点,可以将客户数据复制到单独的表并跟踪电子邮件发送状态。
首先,创建一个名为customer_lists的新表,如下所示:
-- oracle 12c写法 CREATE TABLE customer_lists( list_id NUMBER GENERATED BY DEFAULT AS IDENTITY, first_name varchar2(255) NOT NULL, last_name varchar2(255) NOT NULL, email varchar2(255) NOT NULL, sent NUMBER(1) NOT NULL, sent_date DATE, PRIMARY KEY(list_id) ); -- oracle 11g写法 drop sequence customer_lists_seq; create sequence customer_lists_seq increment by 1 start with 1 maxvalue 9999999999 nocache; CREATE TABLE customer_lists( list_id NUMBER, first_name varchar2(255) NOT NULL, last_name varchar2(255) NOT NULL, email varchar2(255) NOT NULL, sent NUMBER(1) NOT NULL, sent_date DATE, PRIMARY KEY(list_id) );
其次,将contacts表中的数据复制到customer_lists表中:
-- oracle 12c写法 INSERT INTO customer_lists( first_name, last_name, email, sent ) SELECT first_name, last_name, email, 0 FROM contacts; -- oracle 11g写法 INSERT INTO customer_lists( list_id, first_name, last_name, email, sent ) SELECT customer_lists_seq.nextval, first_name, last_name, email, 0 FROM contacts;
在这个例子中,除了从contacts表中检索数据之外,我们还使用文字值:0 作为sent列的初始值。
以下查询从customer_lists表中检索数据:
请注意,这个例子只是为了演示,可以将DEFAULT 0添加到sent列的定义中。