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'