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;

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