多个主键约束的情况下怎么查询表里有重复主键更新已有记录的记录

查询一张表中两个字段重复的数据并得到其主键? - ITeye问答
希望各位路过的大侠 帮小弟一把。感激不尽。
如何查询一张表中两个字段都重复的数据以及每组中的第一条数据的主键? 情况如下: A表: a1 a2 a3
要求:查询出A表中a2
a3两个字段同时重复的数据以及每组中的第一条数据的主键a1 结果示例:
(不知各位大侠能不能明白我的意思?)
对于重复的数据: select a2,a3 from A a
group by a2,a3
having count(a1)&=2
但分组后怎么同时把每组中第一条数据的a1也查出来,然后根据这a1查询出表中所有的数据。
问题补充:&div class="quote_title"&liveHappy 写道&/div&&div class="quote_div"&不知道你用的是什么数据库,我这有我以前给一个也是提问题的朋友写的,测试可以不过是oracle的语句。
&br /&&pre name="code" class="sql"&
select t.a1,t.a2,t.a4 from (select a1,a2,a3,a4, row_number() over (partition by a2,a3 order by a1 asc) as num from a) t where num &2;
&/pre&
&br /&在sql server中,如果要分组的话就那么分组字段就得显示。
&br /&那你的数据如果在sql server中直接一个分组就搞定了。
&br /&&pre name="code" class="java"&
select& min(id),a2,a3 from a group by a2,a3;
&/pre&
&br /&如果不加min()的话不能执行,看不到id的。加上就ok了。
&br /&&/div&
&br /&
&br /&
&br /&
&br /&实在是高,这让我问这个问题问地实在是惭愧,汗颜无泪。非常感谢 happye大哥的慷慨赐教,让我着实感觉自己思考的东西太少了。 还将oracle的语法也拿出来了 为了感谢,我将仅有的10分都拜送给您,祝大哥的生活越过越happy!技术越来越Heigh。
采纳的答案
不知道你用的是什么数据库,我这有我以前给一个也是提问题的朋友写的,测试可以不过是oracle的语句。
select t.a1,t.a2,t.a4 from (select a1,a2,a3,a4, row_number() over (partition by a2,a3 order by a1 asc) as num from a) t where num &2;
在sql server中,如果要分组的话就那么分组字段就得显示。
那你的数据如果在sql server中直接一个分组就搞定了。
min(id),a2,a3 from a group by a2,a3;
如果不加min()的话不能执行,看不到id的。加上就ok了。
select a1,a2,a3 from A a where a1 not in(
&& select a1 from A a where a2=a3 group by a2
没测试哈!大概意思是 select a1 from A a where a2=a3 group by a2
找出重复的然后 分组去掉一个
已解决问题
未解决问题Oracle 查找与删除表中重复记录的步骤方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Oracle 查找与删除表中重复记录的步骤方法
上传于||暂无简介
你可能喜欢多表查询结果出现了重复记录,在这些重复的记录中,根据(日期最晚的)条件要其中的一条记录,oracel中如何写 - Oracle开发当前位置:& &&&多表查询结果出现了重复记录,在这些重复的记录中,多表查询结果出现了重复记录,在这些重复的记录中,根据(日期最晚的)条件要其中的一条记录,oracel中如何写&&网友分享于:&&浏览:0次多表查询结果出现了重复记录,在这些重复的记录中,根据(日期最晚的)条件要其中的一条记录,oracel中怎么写啊多表查询结果出现了重复记录,在这些重复的记录中,根据(日期最晚的)条件要其中的一条记录,oracel中怎么写啊,求教各位大神------解决思路----------------------根据日期排序,然后取第一条记录
select&*&from&(select&*&from&......&order&by&日期&desc)&where&rownum=1;------解决思路----------------------百度&oracle&&ROW_NUMBER()&OVER------解决思路----------------------百度&oracle&&ROW_NUMBER()&OVER------解决思路----------------------百度&oracle&&ROW_NUMBER()&OVER&------解决思路----------------------方法一堆,最后一种执行速度应该最快,但是写起来有点麻烦
select&id,ID,日期
&&&&select&id,ID,日期,row_number()&over(partition&by&ID&order&by&日期&DESC)&rn
&&&&from&T
)where&rn=1
select&*&from&T&T1
WHERE&NOT&EXISTS(SELECT&1&FROM&T&WHERE&ID=T1.ID&AND&日期&T1.日期)
select&*&from&T
WHERE&(ID,日期)&IN&(SELECT&ID,MAX(日期)&FROM&T&GROUP&BY&ID)
SELECT&ID,MAX(日期),
MAX(字段1)KEEP(DENSE_RANK&LAST&ORDER&BY&日期),
MAX(字段2)KEEP(DENSE_RANK&LAST&ORDER&BY&日期)
……--其他字段同上
FROM&T&GROUP&BY&ID
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有68528人阅读
数据库(12)
1、在面试的时候碰到一个 问题,就是让写一张表中有id和name 两个字段,查询出name重复的所有数据,现在列下:
select * from xi a where (a.username) in &(select username from xi group by username &having count(*) & 1)
2、查询出所有数据进行分组之后,和重复数据的重复次数的查询数据,先列下:
select &count(username) as '重复次数',username from xi group by username &having count(*)&1 order by username desc
3、一下为 查看别人的 结果,现列下:查询及删除重复记录的方法大全
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,sex,Count(*) From A Group By Name,sex Having Count(*) & 1
方法一declare @max integer,@id integerdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) &; 1open cur_rowsfetch cur_rows into @id,@maxwhile @@fetch_status=0beginselect @max = @max -1set rowcount @maxdelete from 表名 where
主字段 = @idfetch cur_rows into @id,@maxendclose cur_rowsset rowcount 0
方法二"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
  1、对于第一种重复,比较容易解决,使用select distinct * from tableName  就可以得到无重复记录的结果集。  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除select distinct * into #Tmp from tableNamedrop table tableNameselect * into tableName from #Tmpdrop table #Tmp  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集select identity(int,1,1) as autoID, * into #Tmp from tableNameselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoIDselect * from #Tmp where autoID in(select autoID from
#tmp2)  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
查询重复select * from tablename where id in (select id from tablenamegroup by idhaving count(id) & 1)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:279299次
积分:4087
积分:4087
排名:第6106名
原创:151篇
转载:60篇
译文:26篇
评论:18条
(1)(1)(3)(2)(2)(4)(4)(1)(1)(3)(1)(3)(1)(7)(5)(1)(2)(2)(8)(11)(3)(2)(10)(7)(10)(9)(7)(3)(17)(6)(5)(9)(12)(6)(14)(3)(24)(25)(2)(1)}

我要回帖

更多关于 sql删除主键约束 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信