您的位置:首页 > 数据库 > Oracle

Oracle查询优化改写技巧与案例上架了

2014-12-09 13:42 411 查看
应邀写了本sql改写的书,终于上架了

http://item.jd.com/11587404.html



勘误:

1、 yyyy转为日期时的问题

附部分样例数据:

1.4

CREATE OR REPLACE VIEW v AS

SELECT NULL AS C1, NULL AS C2, 1 AS C3, NULL AS C4, 2 AS C5, NULL AS C6 FROM DUAL UNION ALL

SELECT NULL AS C1, NULL AS C2, NULL AS C3, 3 AS C4, NULL AS C5, 2 AS C6 FROM DUAL;

1.13

CREATE OR REPLACE VIEW v AS

SELECT 'ABCEDF' AS vname FROM dual

UNION ALL

SELECT '_BCEFG' AS vname FROM dual

UNION ALL

SELECT '_BCEDF' AS vname FROM dual

UNION ALL

SELECT '_\BCEDF' AS vname FROM dual

UNION ALL

SELECT 'XYCEG' AS vname FROM dual;

3.5

CREATE TABLE L AS

SELECT 'left_1' AS str,'1' AS v FROM dual UNION ALL

SELECT 'left_2','2' AS v FROM dual UNION ALL

SELECT 'left_3','3' AS v FROM dual UNION ALL

SELECT 'left_4','4' AS v FROM dual;

/*右表*/

CREATE TABLE R AS

SELECT 'right_3' AS str,'3' AS v,1 AS status FROM dual UNION ALL

SELECT 'right_4' AS str,'4' AS v,0 AS status FROM dual UNION ALL

SELECT 'right_5' AS str,'5' AS v,0 AS status FROM dual UNION ALL

SELECT 'right_6' AS str,'6' AS v,0 AS status FROM dual;

3.10

CREATE TABLE emp_bonus (empno INT , received DATE , TYPE INT);

INSERT INTO emp_bonus VALUES( 7934, DATE '2005-5-17', 1 );

INSERT INTO emp_bonus VALUES( 7934, DATE '2005-2-15', 2 );

INSERT INTO emp_bonus VALUES( 7839, DATE '2005-2-15', 3 );

INSERT INTO emp_bonus VALUES( 7782, DATE '2005-2-15', 1 );

4.5

CREATE TABLE t1 AS

SELECT '熊样,精神不佳' AS d1,

'猫样,温驯听话' AS d2,

'狗样,神气活现' AS d3,

'鸟样,向往明天' AS d4,

'花样,愿你快乐像花儿一样' AS d5

FROM dual;

4.9

create table dupes (id integer, name varchar(10));

INSERT INTO dupes VALUES (1, 'NAPOLEON');

INSERT INTO dupes VALUES (2, 'DYNAMITE');

INSERT INTO dupes VALUES (3, 'DYNAMITE');

INSERT INTO dupes VALUES (4, 'SHE SELLS');

INSERT INTO dupes VALUES (5, 'SEA SHELLS');

INSERT INTO dupes VALUES (6, 'SEA SHELLS');

INSERT INTO dupes VALUES (7, 'SEA SHELLS');

5.6

CREATE OR REPLACE VIEW v AS

SELECT '123' as data FROM dual UNION ALL

SELECT 'abc' FROM dual UNION ALL

SELECT '123abc' FROM dual UNION ALL

SELECT 'abc123' FROM dual UNION ALL

SELECT 'a1b2c3' FROM dual UNION ALL

SELECT 'a1b2c3#' FROM dual UNION ALL

SELECT '3$' FROM dual UNION ALL

CREATE OR REPLACE VIEW v AS

SELECT 'A' as data FROM dual UNION ALL

SELECT 'AB' FROM dual UNION ALL

SELECT 'BA' FROM dual UNION ALL

SELECT 'BAC' FROM dual;

5.14

CREATE OR REPLACE VIEW v AS

SELECT REPLACE(mixed, ' ', '') AS mixed

FROM (SELECT substr(ename, 1, 2) || CAST(deptno AS CHAR(4)) ||

substr(ename, 3, 2) AS mixed

FROM emp

WHERE deptno = 10

UNION ALL

SELECT CAST(empno AS CHAR(4)) AS mixed FROM emp WHERE deptno = 20

UNION ALL

SELECT ename AS mixed FROM emp WHERE deptno = 30) x;

6.4

CREATE OR REPLACE VIEW V (id,amt,trx)

AS

SELECT 1, 100, 'PR' FROM dual UNION ALL

SELECT 2, 100, 'PR' FROM dual UNION ALL

SELECT 3, 50, 'PY' FROM dual UNION ALL

SELECT 4, 100, 'PR' FROM dual UNION ALL

SELECT 5, 200, 'PY' FROM dual UNION ALL

SELECT 6, 50, 'PY' FROM dual;

8.14

CREATE OR REPLACE VIEW emp_project(empno, ename, proj_id, proj_start, proj_end) AS

SELECT 7782, 'CLARK' , 1 , date '2005-06-16', date '2005-06-18' FROM dual UNION ALL

SELECT 7782, 'CLARK' , 4 , date '2005-06-19', date '2005-06-24' FROM dual UNION ALL

SELECT 7782, 'CLARK' , 7 , date '2005-06-22', date '2005-06-25' FROM dual UNION ALL

SELECT 7782, 'CLARK' , 10, date '2005-06-25', date '2005-06-28' FROM dual UNION ALL

SELECT 7782, 'CLARK' , 13, date '2005-06-28', date '2005-07-02' FROM dual UNION ALL

SELECT 7839, 'KING' , 2 , date '2005-06-17', date '2005-06-21' FROM dual UNION ALL

SELECT 7839, 'KING' , 8 , date '2005-06-23', date '2005-06-25' FROM dual UNION ALL

SELECT 7839, 'KING' , 14, date '2005-06-29', date '2005-06-30' FROM dual UNION ALL

SELECT 7839, 'KING' , 11, date '2005-06-26', date '2005-06-27' FROM dual UNION ALL

SELECT 7839, 'KING' , 5 , date '2005-06-20', date '2005-06-24' FROM dual UNION ALL

SELECT 7934, 'MILLER', 3 , date '2005-06-18', date '2005-06-22' FROM dual UNION ALL

SELECT 7934, 'MILLER', 12, date '2005-06-27', date '2005-06-28' FROM dual UNION ALL

SELECT 7934, 'MILLER', 15, date '2005-06-30', date '2005-07-03' FROM dual UNION ALL

SELECT 7934, 'MILLER', 9 , date '2005-06-24', date '2005-06-27' FROM dual UNION ALL

SELECT 7934, 'MILLER', 6 , date '2005-06-21', date '2005-06-23' FROM dual;

9.1

CREATE OR REPLACE VIEW v(proj_id, proj_start, proj_end) AS

SELECT 1 , date '2005-01-01', date '2005-01-02' FROM dual UNION ALL

SELECT 2 , date '2005-01-02', date '2005-01-03' FROM dual UNION ALL

SELECT 3 , date '2005-01-03', date '2005-01-04' FROM dual UNION ALL

SELECT 4 , date '2005-01-04', date '2005-01-05' FROM dual UNION ALL

SELECT 5 , date '2005-01-06', date '2005-01-07' FROM dual UNION ALL

SELECT 6 , date '2005-01-16', date '2005-01-17' FROM dual UNION ALL

SELECT 7 , date '2005-01-17', date '2005-01-18' FROM dual UNION ALL

SELECT 8 , date '2005-01-18', date '2005-01-19' FROM dual UNION ALL

SELECT 9 , date '2005-01-19', date '2005-01-20' FROM dual UNION ALL

SELECT 10, date '2005-01-21', date '2005-01-22' FROM dual UNION ALL

SELECT 11, date '2005-01-26', date '2005-01-27' FROM dual UNION ALL

SELECT 12, date '2005-01-27', date '2005-01-28' FROM dual UNION ALL

SELECT 13, date '2005-01-28', date '2005-01-29' FROM dual UNION ALL

SELECT 14, date '2005-01-29', date '2005-01-30' FROM dual;

9.4

CREATE OR REPLACE VIEW Timesheets(task_id, start_date , end_date) AS

SELECT 1, DATE '1997-01-01', DATE '1997-01-03' FROM dual UNION ALL

SELECT 2, DATE '1997-01-02', DATE '1997-01-04' FROM dual UNION ALL

SELECT 3, DATE '1997-01-04', DATE '1997-01-05' FROM dual UNION ALL

SELECT 4, DATE '1997-01-06', DATE '1997-01-09' FROM dual UNION ALL

SELECT 5, DATE '1997-01-09', DATE '1997-01-09' FROM dual UNION ALL

SELECT 6, DATE '1997-01-09', DATE '1997-01-09' FROM dual UNION ALL

SELECT 7, DATE '1997-01-12', DATE '1997-01-15' FROM dual UNION ALL

SELECT 8, DATE '1997-01-13', DATE '1997-01-13' FROM dual UNION ALL

SELECT 9, DATE '1997-01-15', DATE '1997-01-15' FROM dual UNION ALL

SELECT 10, DATE '1997-01-17', DATE '1997-01-17' FROM dual;

13.1

CREATE OR REPLACE VIEW v AS

SELECT 'xxxxxabc[867]xxx[-]xxxx[5309]xxxxx' msg FROM dual UNION ALL

SELECT 'xxxxxtime:[11271978]favnum:[4]id:[Joe]xxxxx' msg FROM dual UNION ALL

SELECT 'call:[F_GET_ROWS()]b1:[ROSEWOOD…SIR]b2:[44400002]77.90xxxxx' msg FROM dual UNION ALL

SELECT 'film:[non_marked]qq:[unit]tailpipe:[withabanana?]80sxxxxx' msg FROM dual UNION ALL

SELECT '[一][二][三]' msg FROM dual;

13.2

CREATE OR REPLACE VIEW v AS

SELECT 'ClassSummary' strings FROM dual UNION ALL

SELECT '3453430278' FROM dual UNION ALL

SELECT 'findRow 55' FROM dual UNION ALL

SELECT '1010 switch' FROM dual UNION ALL

SELECT '333' FROM dual UNION ALL

SELECT 'threes' FROM dual;

13.4

CREATE TABLE j1 AS

SELECT 1 AS col1 FROM dual;

CREATE TABLE j2 AS

SELECT 1 AS col1 FROM dual UNION ALL

SELECT 2 AS col1 FROM dual;

CREATE TABLE j3 AS

SELECT 3 AS col1 FROM dual UNION ALL

SELECT 4 AS col1 FROM dual;

CREATE TABLE j4 AS

SELECT 1 AS col1 FROM dual UNION ALL

SELECT 2 AS col1 FROM dual;

SELECT j1.col1, j2.col1, j3.col1, j4.col1

FROM j1

FULL JOIN j2 ON j2.col1 = j1.col1

FULL JOIN j3 ON j3.col1 = j1.col1

FULL JOIN j4 ON j4.col1 = j1.col1;

13.5

CREATE TABLE area AS

SELECT '重庆' AS 市, '沙坪坝' AS 区, '小龙坎' AS 镇 FROM dual UNION ALL

SELECT '重庆' AS 市, '沙坪坝' AS 区, '磁器口' AS 镇 FROM dual UNION ALL

SELECT '重庆' AS 市, '九龙坡' AS 区, '杨家坪' AS 镇 FROM dual UNION ALL

SELECT '重庆' AS 市, '九龙坡' AS 区, '谢家湾' AS 镇 FROM dual;

13.7

CREATE OR REPLACE VIEW X0(人员编号,开始时间,结束时间,类型,数值id) AS

SELECT 11, to_date('201305','yyyymm'), to_date('201308','yyyymm'), 1, 1 FROM dual UNION ALL

SELECT 11, to_date('201307','yyyymm'), NULL, 1, 2 FROM dual UNION ALL

SELECT 11, to_date('201301','yyyymm'), NULL, -1, 3 FROM dual UNION ALL

SELECT 11, to_date('201312','yyyymm'), NULL, 1, 4 FROM dual UNION ALL

SELECT 22, to_date('201305','yyyymm'), to_date('201306','yyyymm'), 1, 1 FROM dual UNION ALL

SELECT 22, to_date('201308','yyyymm'), to_date('201309','yyyymm'), 1, 2 FROM dual UNION ALL

SELECT 22, to_date('201312','yyyymm'), to_date('201312','yyyymm'), -1, 3 FROM dual UNION ALL

SELECT 22, to_date('201403','yyyymm'), NULL, 1, 4 FROM dual UNION ALL

SELECT 22, to_date('201405','yyyymm'), NULL, -1, 4 FROM dual UNION ALL

SELECT 33, to_date('201305','yyyymm'), to_date('201305','yyyymm'), 1, 1 FROM dual UNION ALL

SELECT 33, to_date('201307','yyyymm'), to_date('201307','yyyymm'), 1, 2 FROM dual UNION ALL

SELECT 33, to_date('201310','yyyymm'), NULL, -1, 3 FROM dual UNION ALL

SELECT 33, to_date('201312','yyyymm'), NULL, 1, 4 FROM dual;

14.31

DROP TABLE PROCS PURGE;

CREATE TABLE PROCS(proc_id,anest_name,start_time,end_time) AS

SELECT 10, 'Baker', '08:00', '11:00' FROM dual UNION ALL

SELECT 20, 'Baker', '09:00', '13:00' FROM dual UNION ALL

SELECT 30, 'Dow' , '09:00', '15:30' FROM dual UNION ALL

SELECT 40, 'Dow' , '08:00', '13:30' FROM dual UNION ALL

SELECT 50, 'Dow' , '10:00', '11:30' FROM dual UNION ALL

SELECT 60, 'Dow' , '12:30', '13:30' FROM dual UNION ALL

SELECT 70, 'Dow' , '13:30', '14:30' FROM dual UNION ALL

SELECT 80, 'Dow' , '18:00', '19:00' FROM dual;

14.32

/*病人对医疗机构提出法律索赔,记录表为Claims*/

CREATE OR REPLACE VIEW Claims(索赔号, 患者) AS

SELECT 10, 'Smith' FROM DUAL UNION ALL

SELECT 20, 'Jones' FROM DUAL UNION ALL

SELECT 30, 'Brown' FROM DUAL;

/*每一项索赔都有一个或多个被告(defendant),通常都是医生,记录表为Defendants*/

CREATE OR REPLACE VIEW Defendants(索赔号, 被告) as

SELECT 10, 'Johnson' FROM DUAL UNION ALL

SELECT 10, 'Meyer' FROM DUAL UNION ALL

SELECT 10, 'Dow' FROM DUAL UNION ALL

SELECT 20, 'Baker' FROM DUAL UNION ALL

SELECT 20, 'Meyer' FROM DUAL UNION ALL

SELECT 30, 'Johnson' FROM DUAL;

/*每个与索赔相关的被告都有法律事件历史,当某项索赔的被告索赔状态发生变化时,都会记录下来*/

CREATE OR REPLACE VIEW LegalEvents(索赔号, 被告, 索赔状态, change_date) as

SELECT 10, 'Johnson', 'AP', date '1994-01-01' from dual union all

SELECT 10, 'Johnson', 'OR', date '1994-02-01' from dual union all

SELECT 10, 'Johnson', 'SF', date '1994-03-01' from dual union all

SELECT 10, 'Johnson', 'CL', date '1994-04-01' from dual union all

SELECT 10, 'Meyer' , 'AP', date '1994-01-01' from dual union all

SELECT 10, 'Meyer' , 'OR', date '1994-02-01' from dual union all

SELECT 10, 'Meyer' , 'SF', date '1994-03-01' from dual union all

SELECT 10, 'Dow' , 'AP', date '1994-01-01' from dual union all

SELECT 10, 'Dow' , 'OR', date '1994-02-01' from dual union all

SELECT 20, 'Meyer' , 'AP', date '1994-01-01' from dual union all

SELECT 20, 'Meyer' , 'OR', date '1994-02-01' from dual union all

SELECT 20, 'Baker' , 'AP', date '1994-01-01' from dual union all

SELECT 30, 'Johnson', 'AP', date '1994-01-01' from dual;

/*对于每个被告索赔状态的变化按照法律制定的已知顺序进行,如下面的Claim状态表所示*/

CREATE OR REPLACE VIEW ClaimStatusCodes(索赔状态, 索赔状态描述, 顺序) as

SELECT 'AP', 'Awaiting review panel' , 1 from dual union all

SELECT 'OR', 'Panel opinion rendered', 2 from dual union all

SELECT 'SF', 'Suit filed' , 3 from dual union all

SELECT 'CL', 'Closed' , 4 from dual;

14.33

DROP TABLE supparts;

CREATE TABLE supparts(

供应商编码 CHAR(2) not null,

零件编码 CHAR(2) not null,

PRIMARY KEY (供应商编码,零件编码));

INSERT INTO supparts

SELECT '1', '1' FROM dual UNION ALL

SELECT '1', '2' FROM dual UNION ALL

SELECT '1', '3' FROM dual UNION ALL

/**/

SELECT '2', '3' FROM dual UNION ALL

SELECT '2', '4' FROM dual UNION ALL

SELECT '2', '5' FROM dual UNION ALL

/**/

SELECT '3', '1' FROM dual UNION ALL

SELECT '3', '2' FROM dual UNION ALL

SELECT '3', '3' FROM dual UNION ALL

/**/

SELECT '4', '1' FROM dual UNION ALL

SELECT '4', '0' FROM dual UNION ALL

SELECT '4', '3' FROM dual UNION ALL

/**/

SELECT '5', '1' FROM dual UNION ALL

SELECT '5', '2' FROM dual UNION ALL

SELECT '5', '5' FROM dual UNION ALL

/**/

SELECT '6', '1' FROM dual UNION ALL

SELECT '6', '4' FROM dual UNION ALL

SELECT '6', '5' FROM dual;

14.34

DROP TABLE PilotSkills;

CREATE TABLE PilotSkills/*飞行员技能*/

(飞行员 CHAR(15) NOT NULL,

飞机 CHAR(15) NOT NULL,

PRIMARY KEY (飞行员, 飞机));

INSERT INTO PilotSkills

SELECT 'Celko', 'Piper Cub' FROM DUAL UNION ALL

SELECT 'Higgins', 'B-52 Bomber' FROM DUAL UNION ALL

SELECT 'Higgins', 'F-14 Fighter' FROM DUAL UNION ALL

SELECT 'Higgins', 'Piper Cub' FROM DUAL UNION ALL

SELECT 'Jones', 'B-52 Bomber' FROM DUAL UNION ALL

SELECT 'Jones', 'F-14 Fighter' FROM DUAL UNION ALL

SELECT 'Smith', 'B-1 Bomber' FROM DUAL UNION ALL

SELECT 'Smith', 'B-52 Bomber' FROM DUAL UNION ALL

SELECT 'Smith', 'F-14 Fighter' FROM DUAL UNION ALL

SELECT 'Wilson', 'B-1 Bomber' FROM DUAL UNION ALL

SELECT 'Wilson', 'B-52 Bomber' FROM DUAL UNION ALL

SELECT 'Wilson', 'F-14 Fighter' FROM DUAL UNION ALL

SELECT 'Wilson', 'F-17 Fighter' FROM DUAL;

DROP TABLE Hangar;

CREATE TABLE Hangar/*飞机棚*/

(飞机 CHAR(15) PRIMARY KEY);

INSERT INTO Hangar

SELECT 'B-1 Bomber' FROM DUAL UNION ALL

SELECT 'B-52 Bomber' FROM DUAL UNION ALL

SELECT 'F-14 Fighter' FROM DUAL;

14.37

DROP TABLE t

/

create table t (a varchar2(30),b varchar2(30),c varchar2(30),d varchar2(30) );

insert into t values('门店1','品牌1','2','8');

insert into t values('门店1','品牌2','3','6');

insert into t values('门店1','品牌3','2','10');

insert into t values('门店2','品牌1','1','4');

insert into t values('门店2','品牌2','4','8');

insert into t values('门店2','品牌3','4','20');

insert into t values('门店3','品牌1','3','12');

insert into t values('门店3','品牌2','2','4');

insert into t values('门店3','品牌3','1','5');

/

14.49

DROP TABLE T PURGE;

CREATE TABLE t AS

SELECT '2' AS col1 ,'4' AS col2 FROM dual UNION ALL

SELECT '1' AS col1 ,'5' AS col2 FROM dual UNION ALL

SELECT '1' AS col1 ,'5' AS col2 FROM dual UNION ALL

SELECT '2' AS col1 ,'5' AS col2 FROM dual UNION ALL

SELECT '3' AS col1 ,'3' AS col2 FROM dual UNION ALL

SELECT '12' AS col1, '16' AS col2 FROM dual UNION ALL

SELECT '11' AS col1 ,'15' AS col2 FROM dual UNION ALL

SELECT '13' AS col1 ,'13' AS col2 FROM dual UNION ALL

SELECT '12' AS col1 ,'17' AS col2 FROM dual;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: