Oracle查询重复数据与删除重复记录方法

 比如现在有一人员表 (表名:peosons)

  若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来

  select p1.*

  from persons p1,persons p2

  where p1.id<>p2.id

  and p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address

  可以实现上述效果。

  几个删除重复记录的SQL语句

  1.用rowid方法

  2.用group by方法

  3.用distinct方法

  1。用rowid方法

  据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:

  查数据:

  select * from table1 a where rowid !=(select max(rowid)

  from table1 b where a.name1=b.name1 and a.name2=b.name2……)

  删数据:

  delete from table1 a where rowid !=(select max(rowid)

  from table1 b where a.name1=b.name1 and a.name2=b.name2……)

  2.group by方法

  查数据:

  select count(num), max(name) from student --列出重复的记录数,并列出他的name属性

  group by num

  having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次

  删数据:

  delete from student

  group by num

  having count(num) >1

  这样的话就把所有重复的都删除了。

  3.用distinct方法 -对于小的表比较有用

  create table table_new as select distinct * from table1 minux

  truncate table table1;

  insert into table1 select * from table_new;

  查询及删除重复记录的方法大全

  1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

  select * from people

  where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

  2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

  delete from people

  where peopleId in (select peopleId from people group by peopleId

  having count(peopleId) > 1)

  and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

  3、查找表中多余的重复记录(多个字段)

  select * from vitae a

  where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

  4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

  delete from vitae a

  where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

  and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

  5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

  select * from vitae a

  where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

  and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

  (二)

  比方说

  在A表中存在一个字段“name”,

  而且不同记录之间的“name”值有可能会相同,

  现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;

  Select Name,Count(*) From A Group By Name Having Count(*) > 1

  如果还查性别也相同大则如下:

  Select Name,***,Count(*) From A Group By Name,*** Having Count(*) > 1

  (三)

  方法一

  declare @max integer,@id integer

  declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1

  open cur_rows

  fetch cur_rows into @id,@max

  while @@fetch_status=0

  begin

  select @max = @max -1

  set rowcount @max

  delete from 表名 where 主字段 = @id

  fetch cur_rows into @id,@max

  end

  close cur_rows

  set rowcount 0

  方法二

  "重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,

  比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

  1、对于第一种重复,比较容易解决,使用

  select distinct * from tableName就可以得到无重复记录的结果集。

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

  select distinct * into #Tmp from tableName

  drop table tableName

  select * into tableName from #Tmp

  drop table #Tmp

  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

  select identity(int,1,1) as autoID, * into #Tmp from tableName

  select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID

  select * from #Tmp where autoID in(select autoID from #tmp2)

  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

  (四)

  查询重复

  select * from tablename where id in (

  select id from tablename

  group by id

  having count(id) > 1

  )


原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/308/12346308.shtml

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/241379/viewspace-761979/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/241379/viewspace-761979/

<think>好的,我现在要解决用户提到的Kali Linux旧源未签名错误的问题。用户遇到的错误是使用旧源'http://old.kali.org/kali sana InRelease'导致的,系统提示仓库未签名,无法安全更新。我需要根据已有的引用信息和自己的知识来提供解决方案。 首先,我需要回忆一下Kali Linux的源配置。通常,这类问题是由于软件源过期密钥失效引起的。用户提到的错误信息中提到EXPKEYSIG ED444FF07D8D0BF6,这可能与仓库的签名密钥有关。但用户现在使用的是旧源sana,而引用中提到的错误是kali-rolling的密钥问题,不过问题根源可能类似,都是密钥过期源地址不正确。 根据引用中的例子,比如引用[1]和[2],用户尝试使用不同的镜像源(如阿里云、USTC)时出现GPG错误解决办法通常是更新密钥者更换正确的源。而用户现在的问题是旧源sana,这可能是一个已经不再支持的版本,所以需要更换到当前支持的源。 步骤应该是: 1. 检查当前系统中的源配置,确认是否确实在使用旧的sana源。 2. 替换旧的源地址为官方推荐的最新源,比如kali-rolling的镜像。 3. 导入正确的GPG密钥,确保仓库签名有效。 4. 执行更新命令验证问题是否解决。 另外,可能需要手动下载并安装新的密钥,者使用wget命令从官方获取密钥并添加到apt-key中。例如,引用中提到的ED444FF07D8D0BF6可能已经过期,需要更新。 还需要注意,Kali Linux的不同版本可能对应不同的仓库名称,比如sana是旧版本,现在应该使用kali-rolling。因此,用户需要更新源列表中的条目,将sana替换为kali-rolling,并选择合适的镜像源。 另外,用户可能还需要清理旧的源列表,避免残留的旧配置导致问题。例如,检查/etc/apt/sources.list文件以及/etc/apt/sources.list.d/目录下的文件,删除注释掉所有涉及旧源sana的行。 最后,执行apt-get updateapt-get upgrade来测试是否解决问题。如果仍有GPG错误,可能需要手动导入新的密钥,比如使用apt-key adv命令。 总结解决方案步骤: 1. 备份当前源列表。 2. 编辑源列表,替换旧源为最新镜像源。 3. 导入新的GPG密钥。 4. 更新并升级系统。 同时,需要提醒用户在操作前备份重要数据,避免操作失误导致系统问题。</think>### 解决方案:Kali Linux旧源未签名错误处理 #### 问题根源分析 错误提示`The repository 'http://old.kali.org/kali sana InRelease' is not signed`表明: 1. 系统正在使用已弃用的旧版Kali源(`sana`为2016年发布的版本,当前官方仅支持`kali-rolling`)[^1][^4]; 2. 旧仓库的GPG密钥已失效,导致APT无法验证软件包安全性。 --- #### 分步解决方法 1. **备份当前源列表** ```bash sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak ``` 2. **更新为官方推荐镜像源** 编辑源配置文件: ```bash sudo nano /etc/apt/sources.list ``` 删除注释所有包含`old.kali.org``sana`的行,替换为以下内容(以阿里云镜像为例): ```plaintext deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib ``` 3. **手动导入最新GPG密钥** ```bash wget -q -O - https://archive.kali.org/archive-key.asc | sudo apt-key add ``` 4. **执行系统更新** ```bash sudo apt-get update && sudo apt-get upgrade -y ``` --- #### 验证结果 若操作成功,终端应输出类似以下信息: ```plaintext Hit:1 http://mirrors.aliyun.com/kali kali-rolling InRelease Reading package lists... Done ``` --- #### 注意事项 - 若使用其他镜像(如清华、中科大),需确保URL中为`kali-rolling`而非`sana`[^2][^3] - 若仍报GPG错误,尝试强制刷新密钥: ```bash sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ED444FF07D8D0BF6 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值