Oracle Insert增强与SQL进阶

INSERT增强与SQL进阶:
一、同时向多张表中插入数据
语法:
INSERT ALL INTO (表1)
VALUES (查出来的字段1, 查出来的字段2)
INTO (表2)
VALUES (查出来的字段1, 查出来的字段2)
SELECT 语句;
举例:

INSERT ALL INTO sal_history
VALUES
  (empid, hiredate, sal)

INTO mgr_history
VALUES
  (empid, mgr, sal)

  SELECT employee_id empid, hire_date hiredate, salary sal, manager_id mgr
    FROM employees
   WHERE employee_id > 200;


这句代码表示将查询的数据按照条件分别插入两个表中。

二、一个来源插入多个目标表(有条件,首次匹配即跳到下一条)

INSERT FIRST WHEN sal > 25000 THEN INTO special_sal
VALUES
  (deptid, sal)

WHEN hiredate LIKE
  ('%00%') THEN INTO hiredate_history_00
VALUES
  (deptid, hiredate)

WHEN hiredate LIKE
  ('%99%') THEN INTO hiredate_history_99
VALUES
  (deptid, hiredate)

ELSE INTO hiredate_history
VALUES
  (deptid, hiredate)
  SELECT department_id deptid, SUM(salary) sal, MAX(hire_date) hiredate
    FROM employees
   GROUP BY department_id;


这句话最重要的思想是如果数据被第一个表匹配了,那么它就不会参与下一个表的匹配(语法就是把上一个例子的all改成了first)。

三、实现列转行

INSERT ALL 
INTO sales_info VALUES (employee_id,week_id,sales_MON)
INTO sales_info VALUES (employee_id,week_id,sales_TUE) 
INTO sales_info VALUES (employee_id,week_id,sales_WED) 
INTO sales_info VALUES (employee_id,week_id,sales_THUR) 
INTO sales_info VALUES (employee_id,week_id, sales_FRI) 
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE, sales_WED, sales_THUR,sales_FRI FROM sales_source_data;

create table sales_source_data
(EMPLOYEE_ID number,
 week_id number, 
 sales_MON number, 
 sales_TUE number, 
 sales_WED number, 
 sales_THUR number,
 sales_FRI number);
 
create table sales_info(employee_id number,week_id number, sales_everyday number);
 
insert into sales_source_data values (149,1,10000,12000,15000,11000,6000);


这个其实就是对Insert all的使用例子。
四、分析函数

SELECT e.last_name
      ,e.salary
      ,d.department_name
      ,AVG(e.salary) over(PARTITION BY d.department_name) department_avg_salary
      ,MAX(e.salary) over(PARTITION BY d.department_name) department_max_salary
      ,MIN(e.salary) over(PARTITION BY d.department_name) department_min_salary
  FROM employees   e
      ,departments d
 WHERE 1 = 1
   AND e.department_id = d.department_id;


SELECT d.department_name
      ,e.last_name
      ,e.salary
      ,rank() over(PARTITION BY d.department_name ORDER BY e.salary DESC) dept_salary_rank1
      ,dense_rank() over(PARTITION BY d.department_name ORDER BY e.salary DESC) dept_salary_rank2
      ,row_number() over(PARTITION BY d.department_name ORDER BY e.salary DESC) dept_salary_rank3
  FROM employees   e
      ,departments d
 WHERE 1 = 1
   AND e.department_id = d.department_id;

五、闪回功能(误删找回)

DELETE FROM departments
WHERE department_name = 'Shipping';

COMMIT;

SELECT * FROM departments WHERE department_name = 'Shipping'; 

insert into departments
SELECT * FROM departments AS OF TIMESTAMP SYSDATE -5/(24*60)
WHERE department_name = 'Shipping';

六、全局临时表

CREATE GLOBAL TEMPORARY TABLE temp_table_session1 (header_id number) ON COMMIT PRESERVE ROWS;


CREATE GLOBAL TEMPORARY TABLE temp_table_session2 (header_id number) ON COMMIT delete  ROWS;

insert into temp_table_session1 values(1);

select * from temp_table_session1;


insert into temp_table_session2 values(1);

select * from temp_table_session2;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值