SQL那點事

1.如何查找重複數據。

select * from cim_terminal t
 where (t.df_raw_id, t.df_yearmonth) in
       (select df_raw_id, df_yearmonth
          from cim_terminal p
         group by p.df_raw_id, p.df_yearmonth
        having count(*) > 1)
   and rowid not in (select min(rowid)
                       from cim_terminal
                      group by df_raw_id
                     having count(*) > 1);

2.如何刪除重複數據,且重複數據只保留一條。
delete from cim_terminal t
 where (t.df_raw_id, t.df_yearmonth) in
       (select df_raw_id, df_yearmonth
          from cim_terminal p
         group by p.df_raw_id, p.df_yearmonth
        having count(*) > 1)
   and rowid not in (select min(rowid)
                       from cim_terminal
                      group by df_raw_id
                     having count(*) > 1); 
當數據量比較大的時候,這種刪除方法效率會比較低。比較好的解決辦法是有:
         1)採用低效率的存儲過程。
         2)藉助臨時表,重新生成數據。
這兩種方法適用於大批量的調整數據。 
3.如何判斷表是否被鎖,即釋放鎖

    1):用以下SQL查看進程列表,判斷出被鎖定的表

SELECT dob.OBJECT_NAME Table_Name,
       lo.SESSION_ID || ', ' || vss.SERIAL# 刪除號,
       lo.locked_mode,
       lo.SESSION_ID,
       vss.SERIAL#,
       vss.action Action,
       vss.osuser OSUSER,
       vss.LOGON_TIME,
       vss.process AP_PID,
       VPS.SPID DB_PID,
       vss.*
  From v$locked_object lo, dba_objects dob, v$session vss, V$PROCESS VPS
 Where lo.OBJECT_ID = dob.OBJECT_ID
   and lo.SESSION_ID = vss.SID
   AND VSS.paddr = VPS.addr
 order by 2, 3, DOB.object_name

    2): 刪除進程,如之前的“刪除號”查找出的結果爲“286, 2184”,則運行以下SQL

    ALTER system kill session '286, 2184' 

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