SQL精华收集
order by 的数值型灵活使用 19楼空间V)K2^S!hP\
select * from table_a where id=p_id order by decode(函数,'asc',1,'desc',-1)*jsny; 19楼空间B~U Pc6z.gXi#Ti
4g]pu?#D~0控制试图的访问时间: 19楼空间5v;?.FF)D3?'[z
6.create view ...
G~3b OD2o+l;R s0as
z](x;M7J
_^0select ... from where exists(select x from dual where sysdate>=8:00am and sysdate<=5:00pm) 19楼空间a$G$e
P3IrH
!D;MB+F"w0妙用decode实现排序
(p!K2B mKptAn3G0select * from tabname 19楼空间2f6F#F/@[!AX
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');
e
tX[s019楼空间'fbVGh
select * from tabname
+Kr,bZ.I&k2d+F0order by decode(mode,'FIFO',rq-sysdate, sysdate-rq)
'd$t+Qn@c4O0
%QV'j/R^X0
?u'Q
qcN2m7t0找出某个时期内工作日数: 19楼空间*V6h GYm Nth7p
select count(*) 19楼空间)u%Lf)H
^Q+XcR"X@
from ( select rownum-1 rnum 19楼空间^D:L!O
ul(xo:\.VON
from all_objects
q6cT O;r!?K6]0where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- 19楼空间\%](S+dB|/b%KT
02-01','yyyy-mm-dd')+1 )
gEY"k&[,[5S$O0where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) not
|'E2\?&E3QGa7l3Bl0in ( '1', '7' ) 19楼空间 N3WHF0pts:~
*kHuG4L}(h#Uo0我觉得查询重复记录的语句就很经典
5L%\k:t7`6^(pp0select rowid,bdsszd from BADWDJ a where a.rowid != (select max(rowid) from BADWDJ b where a.bdsszd =b.bdsszd)
V3yp.? xm0由它引申的就有很多有用的语句,如昨天回答别人的排序的难题 19楼空间|cII$R4j
select id,bdsszd from BADWDJ a where a.id = (select max(id) from BADWDJ b where a.bdsszd =b.bdsszd) order by id 19楼空间 {1L&Z$y"[O
Wy`
19楼空间^WCM8l [L
树型结构表的查询:
*l$ew2m{&j*|MgMl0select ID,PARENT_ID from parent_child
.Ze2[,Ix%_9g$e%bYb0connect by prior id = parent_id
?pnm7q$h
kbN0start with id = 1;
4\e,v;nC N%Xt}0F4lN019楼空间
m7w+hH
A4[k j!gt
1.decode这个函数一定需要会,我觉得sql的灵活很多地方都是通过这个function来体现的,相当于if,很好用。 19楼空间m2BU,PJ*Nt
xNUl)ju/R5Y.^02.group by,这个东东想想简单,其实好多统计功能是离不开这个操作的。oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。值得注意的是,当你对事物做过有效的人为归并之后执行group by 往往会更让人心旷神怡。 19楼空间H6bn'{2Q!CoG2w
3.很表竖置的经典写法,也要记住:sum(decode( )) group by ... 19楼空间,`3a'j Zp)X3E
@u
注意:需要在一个subquery中确定一个横置判点。 19楼空间q"x5p8L8^c
4.树形结构表的遍历写法:select ...from ....
|W"v2evBB0start with ... connect by prior (父子关系表达式)
h'TPwaq
~(ZTD0
z-SK,Kt0select * from xxx where decode(:var,null,'0',column1) = decode(:var,null,'0',:var);
-V@qo2aC"e019楼空间9muuoh(d,N
816以上的 一些分析函数如 rank() over() and row_number() over() 19楼空间/BSat;c
当然关于 group by rollup/cube使用的人恐怕特别少 19楼空间}4Ff b4i$m C e
19楼空间3w9ed5H$RH
如何实现最大匹配的操作? 19楼空间(L0cLB-n
例如:给定字符串 '1234', 而表中可能有记录项'1','12','123','1234','12345',要选出'1234'项 19楼空间%M8?-X;Y4q `
select * from ( 19楼空间+Kj;P'~h B
select col_FT from table_FT