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

应邀写了本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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章