1. WE
ARE
SHOWING
CODING SAMPLES
SO IF YOU HAVE PASSED
THE AGE OF TWENTY THEN YOU SHOULD PROBABLY THINK
ABOUT SITTING RIGHT UP CLOSE TO THE FRONT OF THE ROOM BECAUSE OTHERWISE YOU MIGHT MISS OUT
A N D I F Y O U C A N R E A D T H I S, T H E N Y O U S H O U L D L E A V E B E C A U S E Y O U H A V E S U P E R P O W E R S A N D Y O U S H O U L D B E I N A N A V E N G E R S M O V I E N O T L E A R N I N G A B O U T I N F O R M A T I O N T E C H N O L O G Y. :-)
25. SQL> with x( s, ind ) as
2 ( select sud, instr( sud, '.' )
3 from ( select replace(replace(
4 replace(replace(:board,'-'),'|'),' '),chr(10)) sud
5 from dual )
6 union all
7 select substr(s,1,ind-1)||z||substr(s,ind+1)
8 , instr(s,'.',ind+1)
9 from x
10 , ( select to_char( rownum ) z
11 from dual connect by rownum <= 9 ) z
12 where ind > 0
13 and not exists (
14 select null
15 from ( select rownum lp from dual
16 connect by rownum <= 9 )
17 where z = substr(s,trunc((ind-1)/9)*9+lp,1)
25
26. 18 or z = substr(s,mod(ind-1,9)-8+lp*9,1)
19 or z = substr(s,mod(trunc((ind-1)/3),3)*3
20 +trunc((ind-1)/27)*27+lp
21 +trunc((lp-1)/3)*6,1)
22 )
23 ),
24 result as (
25 select s
26 from x
27 where ind = 0 )
28 select
29 regexp_replace(substr(s,(idx-1)*9+1,9),
30 '(...)(...)(...)',
31 '1|2|3')||
32 case when mod(idx,3)=0 then chr(10)||rpad('-',11,'-') end soln
33 from result,
34 ( select level idx
35 from dual
36 connect by level <= 9 )
26
Ack: Anton Scheffer,
https://technology.amis.nl
52. select *
from generate_series(1, 10)
52
with gen(seq) as (
select 1 seq
union all
select seq+1 from gen
where seq < 10
)
select * from gen;
select seq
from my_n_row_table
Postgres
SQL Server
MySQL
53. SQL> select level seq
2 from DUAL
3 connect by level <= 10;
-----------------------------------------------------
| Id | Operation | Name | Rows |
-----------------------------------------------------
| 0 | SELECT STATEMENT | | 1 |
|* 1 | CONNECT BY WITHOUT FILTERING| | |
| 2 | FAST DUAL | | 1 |
-----------------------------------------------------
Statistics
------------------------------
1 recursive calls
0 db block gets
0 consistent gets
0 physical reads
53
77. "First, get the total salary paid by each department,
then get the average of these totals,
then list those departments above that average"
77
SQL ?
78. "First, get the total salary paid by department...
SQL> WITH dept_salaries AS (
2 SELECT dname, SUM(sal) dept_sal
3 FROM emp e, dept d
4 WHERE e.deptno = d.deptno
5 GROUP BY dname),
78
79. "...then get the average of these totals...
6 avg_sal AS ( SELECT AVG(dept_sal) avsal
7 FROM dept_salaries)
79
80. "...then list those departments above average."
8 SELECT * FROM dept_salaries d, avg_sal a
9 WHERE d.dept_sal > a.avsal
10 ORDER BY d.dname;
80
81. SQL> WITH dept_salaries AS (
2 SELECT dname, SUM(sal) dept_sal
3 FROM emp e, dept d
4 WHERE e.deptno = d.deptno
5 GROUP BY dname),
6 avg_sal AS ( SELECT AVG(dept_sal) avsal
7 FROM dept_salaries)
8 SELECT * FROM dept_salaries d, avg_sal a
9 WHERE d.dept_sal > a.avsal
10 ORDER BY d.dname;
81
90. 90
SQL> WITH dept_salaries AS (
2 SELECT dname, SUM(sal) dept_sal
3 FROM emp e, dept d
4 WHERE e.deptno = d.deptno
5 GROUP BY dname),
6 avg_sal AS ( SELECT AVG(dept_sal) avsal
7 FROM dept_salaries)
8 SELECT * FROM dept_salaries d, avg_sal a
9 WHERE d.dept_sal > a.avsal
10 ORDER BY d.dname;
join
92. SQL> alter session set sql_trace = true;
Session altered.
SQL> WITH dept_salaries AS (
2 SELECT dname, SUM(sal) dept_sal
3 FROM emp e, dept d
4 WHERE e.deptno = d.deptno
5 GROUP BY dname),
6 avg_sal AS ( SELECT AVG(dept_sal) asal
7 FROM dept_salaries)
8 SELECT * FROM dept_salaries d, avg_sal a
9 WHERE d.dept_sal > a.asal
10 ORDER BY d.dname;
DNAME DEPT_SAL ASAL
-------------- ---------- ----------
RESEARCH 21750 19350
SQL> alter session set sql_trace = false;
Session altered.
92
93. PARSING IN CURSOR #12 len=179 dep=1 uid=0 oct=1...
CREATE GLOBAL TEMPORARY
TABLE "SYS"."SYS_TEMP_0FD9D6625_AF422F5"
("C0" VARCHAR2(14),"C1" NUMBER )
IN_MEMORY_METADATA CURSOR_SPECIFIC_SEGMENT
STORAGE (OBJNO 4254950949 ) NOPARALLEL
END OF STMT
93
130. SQL> with first_200 as
2 ( select f.*, rownum r
3 from
4 ( select *
5 from t
6 order by owner, object_name desc
7 ) f
8 where rownum <= 200
9 )
10 select *
11 from first_200
12 where r <= 10
130
/*+ result_cache */ rownum r, f.*
oc03.sql
r between 11 and 20
142. select emp.*
from emp,
( select trunc(hiredate,'YYYY'), max(empno) empno
from emp
where empno > 0
group by trunc(hiredate,'YYYY') ) x,
( select deptno, avg(sal)
from emp
group by deptno ) y
where x.empno = emp.empno
and y.deptno = emp.deptno
142
143. Id | Operation | Name |
----------------------------------------------|
0 | SELECT STATEMENT | |
1 | HASH JOIN | |
2 | TABLE ACCESS BY INDEX ROWID | EMP |
3 | NESTED LOOPS | |
4 | VIEW | |
5 | SORT GROUP BY | |
6 | TABLE ACCESS BY INDEX ROWID| EMP |
7 | INDEX FULL SCAN | E2 |
8 | INDEX RANGE SCAN | E1 |
9 | VIEW | |
10 | SORT GROUP BY | |
11 | TABLE ACCESS BY INDEX ROWID | EMP |
12 | INDEX RANGE SCAN | E2 |
143
144. ?
144
select emp.*
from emp,
( select trunc(hiredate,'YYYY'), max(empno) empno
from emp
where empno > 0
group by trunc(hiredate,'YYYY') ) x,
( select deptno, avg(sal)
from emp
group by deptno ) y
where x.empno = emp.empno
and y.deptno = emp.deptno
Id | Operation | Name |
----------------------------------------------|
0 | SELECT STATEMENT | |
1 | HASH JOIN | |
2 | TABLE ACCESS BY INDEX ROWID | EMP |
3 | NESTED LOOPS | |
4 | VIEW | |
5 | SORT GROUP BY | |
6 | TABLE ACCESS BY INDEX ROWID| EMP |
7 | INDEX FULL SCAN | E2 |
8 | INDEX RANGE SCAN | E1 |
9 | VIEW | |
10 | SORT GROUP BY | |
11 | TABLE ACCESS BY INDEX ROWID | EMP |
12 | INDEX RANGE SCAN | E2 |
145. select emp.*
from emp,
( select /*+ QB_NAME(YR_HIRE) */
trunc(hiredate,'YYYY'), max(empno) empno
from emp
where empno > 0
group by trunc(hiredate,'YYYY') ) x,
( select /*+ QB_NAME(AV_SAL) */
deptno, avg(sal)
from emp
group by deptno ) y
where x.empno = emp.empno
and y.deptno = emp.deptno
145
select emp.*
from emp,
( select /*+ QB_NAME(YR_HIRE) */
trunc(hiredate,'YYYY'), max(empno) empno
from emp
where empno > 0
group by trunc(hiredate,'YYYY') ) x,
( select /*+ QB_NAME(AV_SAL) */
deptno, avg(sal)
from emp
group by deptno ) y
where x.empno = emp.empno
and y.deptno = emp.deptno
146. Id | Operation | Name | Query Block
----------------------------------------------|--------------
0 | SELECT STATEMENT | |
1 | HASH JOIN | |
2 | TABLE ACCESS BY INDEX ROWID | EMP |
3 | NESTED LOOPS | |
4 | VIEW | |
5 | SORT GROUP BY | |
6 | TABLE ACCESS BY INDEX ROWID| EMP |
7 | INDEX FULL SCAN | E2 |
8 | INDEX RANGE SCAN | E1 |
9 | VIEW | |
10 | SORT GROUP BY | |
11 | TABLE ACCESS BY INDEX ROWID | EMP |
12 | INDEX RANGE SCAN | E2 |
SEL$1
SEL$1
AV_SAL
AV_SAL
AV_SAL
AV_SAL
SEL$1
YR_HIRE
YR_HIRE
YR_HIRE
YR_HIRE
146
183. select prod_id, max(amount)
from stores st,
customers c,
sales s
where s.cust_id = c.cust_id(+)
and c.store_id = st.store_id
and s.amount > 10
group by prod_id
183
hash outer join ? nested loop ?
STORES first ?
sort merge ?
199. SQL> desc SALES_ACROSS
Name Null? Type
----------------------------- -------- -------------
PRODUCT VARCHAR2(20)
Q1 NUMBER
Q2 NUMBER
Q3 NUMBER
Q4 NUMBER
199
205. SQL> select
2 ( select dname
3 from dept
4 where deptno = e.deptno ) dname,
5 decode(empno, 7499,
6 ( select max(sal) from emp ),
7 -1)
8 from
9 ( select * from emp
10 where sal > 0 ) e
11 where
12 ( select max(hiredate) from emp ) < sysdate
13 /
scalar
anywhere an
expression could be
205
220. SQL> select rpad(' ',level)||ename,
2 from emp
3 start with mgr is null
4 connect by prior empno = mgr
ENAME
---------------------------
KING
BLAKE
JAMES
ALLEN
WARD
CLARK
MILLER
220
221. SQL> select empno, ename, mgr
2 from emp
3 where mgr is null;
EMPNO ENAME MGR
---------- -------------------- ----------
7839 KING
221
222. SQL> select e2.empno, e2.ename, e2.mgr
2 from emp e2,
3 ( select empno, mgr
4 from emp
5 where mgr is null ) inner
6 where e2.mgr = inner.empno;
EMPNO ENAME MGR
---------- -------------------- ----------
7566 JONES 7839
7698 BLAKE 7839
7782 CLARK 7839
222
223. SQL> select e3.empno, e3.ename, e3.mgr
2 from emp e3,
3 ( select e2.empno, e2.ename, e2.mgr
4 from emp e2,
5 ( select empno, mgr
6 from emp
7 where mgr is null ) inner
8 where e2.mgr = inner.empno ) inner
9 where e3.mgr = inner.empno;
EMPNO ENAME MGR
---------- -------------------- ----------
7902 FORD 7566
7788 SCOTT 7566
7900 JAMES 7698
7844 TURNER 7698
7654 MARTIN 7698
7521 WARD 7698
7934 MILLER 7782
223
224. SQL> select e4.empno, e4.ename, e4.mgr
2 from emp e4,
3 ( select e3.empno, e3.ename, e3.mgr
4 from emp e3,
5 ( select e2.empno, e2.ename, e2.mgr
6 from emp e2,
7 ( select empno, mgr
8 from emp
9 where mgr is null ) inner
10 where e2.mgr = inner.empno ) inner
11 where e3.mgr = inner.empno ) inner
12 where e4.mgr = inner.empno;
EMPNO ENAME MGR
---------- -------------------- ----------
7876 ADAMS 7788
recursive...
224
227. SQL> with EACH_LEVEL (empno, name, mgr) as
2 ( --
3 -- start with
4 --
5 select empno, ename, mgr
6 from emp
7 where mgr is null
8 --
9 -- connect by
10 --
11 union all
12 select emp.empno, emp.ename, emp.mgr
13 from emp, EACH_LEVEL
14 where emp.mgr = each_level.empno
15 )
16 select *
17 from each_level;
227
228. EMPNO NAME MGR
---------- --------------- ----------
7839 KING
7566 JONES 7839
7698 BLAKE 7839
7782 CLARK 7839
7499 ALLEN 7698
7521 WARD 7698
7654 MARTIN 7698
7788 SCOTT 7566
7844 TURNER 7698
7900 JAMES 7698
7902 FORD 7566
7934 MILLER 7782
7369 SMITH 7902
7876 ADAMS 7788
228
232. SQL> with each_level (empno, name, mgr, rlevel) as
2 ( select empno, ename, mgr, 1 rlevel
3 from emp
4 where mgr is null
5 union all
6 select emp.empno, emp.ename, emp.mgr, rlevel+1
7 from emp, each_level
8 where emp.mgr = each_level.empno
9 )
10 select * from each_level;
EMPNO NAME MGR RLEVEL
---------- --------------- ---------- ----------
7839 KING 1
7566 JONES 7839 2
7698 BLAKE 7839 2
7782 CLARK 7839 2
7499 ALLEN 7698 3
...
232
233. SQL> with each_level (empno, name) as
2 ( select empno, ename from emp
3 where mgr is null
4 union all
5 select e.empno,
6 each_level.name||'-'||e.ename
7 from emp e, each_level
8 where e.mgr = each_level.empno
9 )
10 select empno, name from each_level;
EMPNO NAME
---------- --------------------------------
7839 KING
7566 KING-JONES
7698 KING-BLAKE
7782 KING-CLARK
7499 KING-BLAKE-ALLEN
7521 KING-BLAKE-WARD
...233
235. SQL> with each_level (empno, name, mgr) as
2 ( select empno, ename, mgr
3 from emp
4 where ename = 'KING'
5 union all
6 select emp.empno, emp.ename, emp.mgr
7 from emp, each_level
8 where emp.mgr = each_level.empno
9 )
10 select *
11 from each_level;
ERROR:
ORA-32044: cycle detected while executing recursive WITH query
235
236. SQL> with each_level (empno, name, mgr) as
2 ( select empno, ename, mgr from emp
3 where ename = 'KING'
4 union all
5 select emp.empno, emp.ename, emp.mgr
6 from emp, each_level
7 where emp.mgr = each_level.empno )
8 CYCLE mgr SET is_cycle TO 'Y' DEFAULT 'N'
9 select * from each_level;
EMPNO NAME MGR IS_CYCLE
---------- ---------- ---------- ----------
7839 KING 7499 N
7566 JONES 7839 N
7521 WARD 7698 N
7839 KING 7499 Y
7876 ADAMS 7788 N
...
236
242. SQL> select * from messages;
TXT
----------------------------------------------------------
I caught up with Connor and Maria Colgan today. They have
taken over AskTOM for Oracle Developers
242
243. SQL> select * from twitter_handles;
ID TERM HANDLE
---- ------------------------------ ---------------
1 Connor McDonald @connor_mc_d
2 Connor @connor_mc_d
3 Maria Colgan @sqlmaria
4 Oracle Developers @otndev
5 Oracle @oracle
6 AskTOM @oracleasktom
243
244. SQL> with
2 tweetised(ind,tweet_txt) as
3 (
4 select 1 ind, txt tweet_txt
5 from messages
6 union all
7 select ind+1, replace(tweet_txt,term,handle)
8 from tweetised, twitter_handles
9 where ind = id
10 )
11 select * from tweetised;
244
245. IND TWEET_TXT
--------- -----------------------------------------------------------------------------------------
1 I caught up with Connor and Maria Colgan today. They have taken over AskTOM for...
2 I caught up with Connor and Maria Colgan today. They have taken over AskTOM for...
3 I caught up with @connor_mc_d and Maria Colgan today. They have taken over AskTOM for...
4 I caught up with @connor_mc_d and @sqlmaria today. They have taken over AskTOM for ...
5 I caught up with @connor_mc_d and @sqlmaria today. They have taken over AskTOM for @otndev
6 I caught up with @connor_mc_d and @sqlmaria today. They have taken over AskTOM for @otndev
7 I caught up with @connor_mc_d and @sqlmaria today. They have taken over @oracleasktom ...
245
246. SQL> with
2 tweetised(ind,tweet_txt) as
3 (
4 select 1 ind, txt tweet_txt
5 from messages
6 union all
7 select ind+1, replace(tweet_txt,term,handle)
8 from tweetised, twitter_handles
9 where ind = id
10 )
11 select * from tweetised
12 order by ind desc
13 fetch first 1 row only;
IND TWEET_TXT
---------- ------------------------------------------------------
7 I caught up with @connor_mc_d and @sqlmaria today. They...
246
251. 251
SQL> select dt, val
2 from t
3 order by dt;
DT VAL
--------- ----------
02-JAN-11 195
03-JAN-11
04-JAN-11
05-JAN-11
06-JAN-11 129
07-JAN-11
08-JAN-11
09-JAN-11
10-JAN-11 87
11-JAN-11
...
195
195
195
129
129
129
87
252. 252
SQL> select dt, val,
2 case when val is not null
3 then to_char(row_number() over (order by dt),'fm0000')||'-'||val
4 end max_val
5 from t
6 order by dt;
DT VAL MAX_VAL
--------- ---------- -----------
02-JAN-11 195 0001-195
03-JAN-11
04-JAN-11
05-JAN-11
06-JAN-11 129 0005-129
07-JAN-11
08-JAN-11
09-JAN-11
10-JAN-11 87 0009-87
11-JAN-11
...
253. 253
SQL> select dt, val,
2 max(max_val) over (order by dt) max_val_str
3 from ( select dt, val,
4 case when val is not null
5 then to_char(row_number() over (order by dt),'fm0000')||'-'||val
6 end max_val
7 from t ) order by dt;
DT VAL MAX_VAL_STR
--------- ---------- ------------------
02-JAN-11 195 0001-195
03-JAN-11 0001-195
04-JAN-11 0001-195
05-JAN-11 0001-195
06-JAN-11 129 0005-129
07-JAN-11 0005-129
08-JAN-11 0005-129
09-JAN-11 0005-129
10-JAN-11 87 0009-87
11-JAN-11 0009-87
...
254. 254
SQL> select dt, val,
2 to_number(substr(max(max_val) over (order by dt),5)) max_val
3 from ( select dt, val,
4 case when val is not null
5 then to_char(row_number() over (order by dt),'fm0000')||val
6 end max_val
7 from t ) order by dt
8 /
DT VAL MAX_VAL
--------- ---------- ----------
02-JAN-11 195 195
03-JAN-11 195
04-JAN-11 195
05-JAN-11 195
06-JAN-11 129 129
07-JAN-11 129
08-JAN-11 129
09-JAN-11 129
10-JAN-11 87 87
11-JAN-11 87
255. 255
SQL> select dt, val,
2 last_value(val ignore nulls) over (order by dt) val
3 from t
4 order by dt;
DT VAL VAL
--------- ---------- ----------
02-JAN-11 195 195
03-JAN-11 195
04-JAN-11 195
05-JAN-11 195
06-JAN-11 129 129
07-JAN-11 129
08-JAN-11 129
09-JAN-11 129
10-JAN-11 87 87
11-JAN-11 87