sql語句收集


sql語句收集

1. wm_concat函數也來打擂臺
使用場景:簡單的將一列的字段通過逗號連接起來。
Example:
select a1,(wm_concat(b1),from aa group by a1
如果是10G版本以下通用的語句如下
SELECT t.id id, MAX(substr(sys_connect_by_path(t.sname, ','), 2)) str
FROM (SELECT id, sname, row_number() over(PARTITION BY id ORDER BY sname) rn FROM a) t
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1
AND id = PRIOR id
GROUP BY t.id;


2.帝王之作(Sql語句中實現字段的自動增長。)
Example(實現了日期的自動增長):
select to_char(sysdate+rownum,'mm-dd')
from dual connect by rownum <=7

3.還是你最親(csdn的兄弟們最喜歡用的虛表)
Example:
with tab as
(
select 1
  from dual
union all
select 2 from dual
)
4. 還真另類(將所有列使用'||'拼接後插入一個clob字段)
insert into t_result(clob_col) select F_TASK_NAME||F_CREATER_NAME
||f_result from dual;
5.選擇性插入語句,很實用
INSERT ALL
  WHEN type=1 THEN INTO tab1 VALUES (myseq.NEXTVAL, val)
  WHEN type=2 THEN INTO tab2 VALUES (myseq.NEXTVAL, val)
  WHEN type IN (3,4,5) THEN INTO tab3 VALUES (myseq.NEXTVAL, val)
  ELSE INTO tab4 VALUES (myseq.NEXTVAL, val)
SELECT type, val FROM source_tab;
6.這都被你給刪了(刪除數據重複的記錄)
delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);
7.的確很美,嫁了吧(美妙的數據更新語句,前提是主鍵相同)
update (select s.name name1,s2.name name2 from simple s,simple2 s2 where s.id=s2.id) v set v.name1=v.name2;
8.選擇由你(針對同一數據表是選擇插入,還是更新)
merge  into  a  using  b  on  (a.USER_NO=b.USER_NO) 
  when  matched  then  update  set  a.NAME=b.NAME 
  when  not  matched  then    insert  values  (b.USER_NO,b.NAME)
9.Java愛好者(通用的oracle分頁語句)
SELECT * FROM ( SELECT row_.*, rownum rownum_ FROM (
//生成標準的查詢語句(沒有分頁條件的)
Sql_statement
) row_ WHERE rownum <=  pageSize * pageNumber

) WHERE rownum_ > pageSize * (pageNumber - 1))
10.讓我也來個(使用頻率高的查詢連續記錄)
Example(查詢連續3個月的記錄):
select id from (select id,sbrq,sbbz,
add_months(trunc(sbrq, 'mm'),
  1 - rank() over(partition by id order by sbrq)) ord
  from (select id, sbrq, sbbz from gl_wsbxx where sbbz = 'N'))
  group by id, ord
having count(*) >= 3
11.隨機函數也瘋狂
Example:
sys_guid() 獲取隨機字符串。
dbms_random.value()獲取隨機數
select * from consume SAMPLE(10) where rownum <2;
SELECT * FROM (SELECT * FROM t ORDER BY sys_guid()) WHERE rownum < 2;這個的效率高些
select * from tb order by dbms_random.value()

12.這個選擇性刪除記錄也很拽
Example:
create or replace trigger tt_del_tri
  before delete on tb_Group when(old.groupName = 'system')
declare
  raise_application_error(-20000,'不能刪除系統名字的列');
begin
阻止刪除數據列。。。
13.不老的Kill語句
一  如何查oracle的鎖
SELECT s.username,decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL)
LOCK_LEVEL,o.owner,o.object_name,o.object_type,     
    s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
    FROM v$session s,v$lock l,dba_objects o
    WHERE l.sid = s.sid
    AND l.id1 = o.object_id(+)
    AND s.username is NOT NULL
二  如何殺掉鎖的進程
    Alter system kill session 'sid,serial#'
    alter system disconnect session 'sid,serial#' immediate;
    在win上,還可以採用oracle提供的orakill殺掉一個線程(其實就是一個Oracle進程)
    在Linux/Unix上,可以直接利用kill殺掉數據庫進程對應的OS進程
14.正則表達式也想小試牛刀
Example(regexp_substr,regexp_instr,regexp_like,regexp_replace):
SQL> select REGEXP_REPLACE('李四(AAA)','(.+)\((.+)','\1') from dual;

REGEXP_REPLACE('李四(AAA)','(.
------------------------------
李四

SQL>
15. translate函數也來指招
Example(將a用w代替,b用e代替):
select translate('abcdef','ab','we') from dual;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章