数据库教程-Oracle选择插入数据

跨零代码为大家提供高品质的解决方案,请大家多多来访,跨零不胜感激,在此谢过。

在本教程中,您将学习如何使用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) ); 

以下语句将ordersorder_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; 

执行上面查询语句,得到以下结果 –

Oracle选择插入数据

2. 插入部分销售数据示例

假设只想将2017年的销售摘要数据复制到新表中。 为此,首先创建一个名为sales_2017的新表,如下所示:

CREATE TABLE sales_2017  AS SELECT     * FROM     sales WHERE     1 = 0; 

WHERE子句中的条件是确保sales表中的数据不会被复制到sales_2017表中。

其次,使用Oracle INSERT INTO SELECTWHERE子句将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; 

执行上面查询语句,得到以下结果 –

Oracle选择插入数据

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表中检索数据:

Oracle选择插入数据

请注意,这个例子只是为了演示,可以将DEFAULT 0添加到sent列的定义中。

在本教程中,您已经学习了如何使用Oracle INSERT INTO SELECT语句将查询结果向其它表中插入数据。

  

从零到一,创造未来!跨零综合IT问题解决服务站,欢迎你的到来。Oracle数据库教程 只为你绽放。

本文固定链接: http://kua0.com/2019/01/17/数据库教程-oracle选择插入数据/

为您推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注