查询重复或不重复记录SQL语句

sqlserver 专栏收录该内容
10 篇文章 0 订阅

1.如何用SQL语句把一个表里面某字段内有相同的记录查询出来
现在有一个表 有三列 分别是tel,name,addr
我现在要查询name一样的 
具体T-SQL语句要怎么写 求助
就是name这个列有很多记录在数据库里面 这些人有很多哈 就是如何把这些同名同姓的记录找出来

只显示name
select name from tb group by name having count(*) > 1
显示所有数据
select * from name in (select name from tb group by name having count(*) > 1)

2.T1表有F1,F2,F3字段 T2表有F1,F4字段 查出T1表里所有有重复的记录,如下
select * from T1 where F1 in(select F1 from T1 group by F1,F2,F3 having count(*)>1)

3.怎样用SQL语句在一个表里找出具有两个相同属性的记录?
悬赏分:5 - 解决时间:2008-12-15 17:11 
比如说这个表里有属性:姓名,学号,专业,籍贯等。那我现在要找出专业和籍贯都相同的学生记录。如何用SQL语句实现?
假设相同的专业名为A,籍贯名为B,表名为TAB 
问题补充:不好意思,忘了说一个条件。
就是事先不知道有哪些记录里的专业和籍贯是相同的,A和B是未知的,即有可能A和B有多种取值情况,而现在要全部把它们查找出来。
不是专业=籍贯,而是不同的记录中专业相同AND籍贯相同的,比如说专业都是计算机的,籍贯都是福建福州的;或者专业都是数学的,籍贯都是福建厦门的。
答案:
select 专业,籍贯 , count(*) from tab
group by 专业,籍贯
是专业,籍贯相同的学生记录数

select 专业,籍贯 , count(*) from tab
group by 专业,籍贯 having count(*)>1
是专业,籍贯相同的学生记录数>1条的

select 姓名,学号 , 专业,籍贯 from tab 
order by 专业,籍贯 
就是明细

若你想查某个专业 如 A 和籍贯 如 B的话,
select * from TAB where 专业='A'and 籍贯='B'

 

例如有如下表结构和值
table
fid   name sex
1     a      男
2     b      男
3     c      女
4     d      女
5     a      男
6     b      男
方案一:distinct
select distinct name from table
得到结果:
name
a
b
c
d
实现效果,那如果要同时打开其它记录呢?再试试
select distinct name,id from table
测试没什么效果,查下得知,这样实际是要name和id字段都重复才被筛选。继续查找可得如下方法:
方案二:group by
select *, count(distinct name) from table group by name

Oracle下测试失败,据说MYSQL下通过,不管,继续思考....

select *, count(distinct name) from table group by name 在MYSQL测试失败


翻翻书,试试
select min(fid),name,sex from table group by name
成功,现实如下结果:
fid   name sex
1     a      男
2     b      男
3     c      女
4     d      女

MYSQL测试,没有效果

 

继续思考,如果要打开所有记录,不指定字段用(*),貌似这方法就不行了!
select * from table where fid in(Select min(fid) FROM table group by name)
测试成功
fid   name sex
1     a      男
2     b      男
3     c      女
4     d      女
方案三:
本来已经完了,突然想起前几天在网上查了查询数据中所有某字段重复的记录
select   *   from   table   where   name in(select   name   from   table   group   by   name     having   count(name)=2) 
得到如下结果:
fid   name sex
1     a      男
2     b      男
5     a      男
6     b      男
以此类推:
select   *   from   table   where   name in(select   name   from   table   group   by   name     having   count(name)=1)
按道理说没问题,大家试试~~
再多的字段都全部现实。哎,原来如此简单!回顾网上方法distinct,Inner   Join等等,麻烦,而且有很大局限性.
总结如下:
select distinct name from table打开重复记录的单个字段
select * from table where fid in(Select min(fid) FROM table group by name)打开重复记录的所有字段值
select   *   from   table   where   name in(select   name   from   table   group   by   name     having   count(name)=1)打开重复任意次数的所有记录

4.

Sql Server里面如果没有设定主键而删除重复数据很麻烦:
一:保留重复记录中的一条记录,其他全部删除。
--1:建立临时表,把不重复的数据转存
select distinct * into #Tmp from 表名;
--2:删除原表数据
truncate table 表名;
--3:将数据导回
insert into 表名 select * from #Tmp;
--4:删除临时表
drop table #Tmp;

******************
如果是oracle的话,把 rowid 查出来,按照rowid删除就可以了。
select rowid,表名.* from 表名;
delete from 表名 where rowid != '刚才查询出的某个值'
commit;
******************

select post_content,post_title from wp_posts group by post_content,post_title having count(*)>1
先看看有多少重复的
假设你表中还有id的一个字段
select min(id),post_content,post_title from wp_posts group by post_content,post_title
这些选出来后你看看这些是否可以不删除
然后
delete from wp_posts where id not in (select min(id) from wp_posts group by post_content,post_title)

©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值