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

本文介绍了使用SQL查询数据库中重复记录的方法,包括查询具有相同名字的记录、具有多个相同属性的记录以及如何处理表内的重复数据。


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)

SQL 中,实现重复查询有多种方法,以下是一些常见的方式: ### 使用 `DISTINCT` 关键字 `DISTINCT` 关键字用于返回唯一同的值。当在 `SELECT` 语句中使用 `DISTINCT` 时,它会自动去除结果集中的重复行。 #### 示例 1:查询单个字段重复的记录 ```sql SELECT DISTINCT username FROM msg; ``` 该语句会从 `msg` 表中查询 `username` 字段重复的记录。需要注意的是,`SELECT DISTINCT` 后面若跟多个字段,可能会产生误解,因为它作用于整个选择列表,要确保需求与使用方式匹配。例如,错误写法 `SELECT DISTINCT [字段名] ,[其他字段名] FROM [表名] WHERE [检索条件字句]` 可能会使检索结果仍含重复项,因为 `DISTINCT` 会对整个选择列表去重,而是仅对指定的第一个字段去重 [^3]。 #### 示例 2查询多个字段组合重复的记录 ```sql SELECT DISTINCT column1, column2 FROM your_table; ``` 此语句会返回 `your_table` 表中 `column1` 和 `column2` 组合重复的记录。 #### 示例 3:对截取后的字段进行重复查询 ```sql SELECT DISTINCT substr(report_date, 0, 4) FROM report; ``` 该语句从 `report` 表中截取 `report_date` 字段的前 4 个字符,并返回重复的结果 [^2]。 ### 使用 `GROUP BY` 和 `HAVING` 子句 通过 `GROUP BY` 对数据进行分组,再结合 `HAVING` 子句筛选出符合条件的组,可实现重复查询。 #### 示例:查询重复的所有记录 ```sql SELECT * FROM table WHERE name IN (SELECT name FROM table GROUP BY name HAVING COUNT(name) = 1); ``` 此语句先通过子查询 `SELECT name FROM table GROUP BY name HAVING COUNT(name) = 1` 找出 `name` 字段只出现一次的 `name` 值,然后外层查询从 `table` 表中筛选出 `name` 在这些值中的所有记录,从而得到重复的所有记录 [^1]。 ### 处理多列组合去重且列值可能拼接重复的情况(以 Oracle 为例) 当遇到多列组合去重,且直接拼接列值可能导致重复判断准确时,可加入特殊字符来解决。例如,若确定两列字段中会出现 `#` 这样的字符内容,可使用如下语句: ```sql -- 假设 t 是表的别名,address 和 customer_name 是列名 SELECT * FROM your_table t WHERE (t.address || '#' || t.customer_name) IN (SELECT t.address || '#' || t.customer_name FROM your_table t GROUP BY t.address || '#' || t.customer_name HAVING COUNT(*) = 1); ``` 该语句通过在两列之间加入特殊字符 `#` 进行拼接,再进行分组和筛选,以准确找出重复的记录 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值