SQL那点事

1 篇文章 0 订阅

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' 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值