1,首先创建一个表,并在表中插入重复的记录,如下图所示。
2,插入好以后就看见表中已经有重复的数据了,如下图所示。
3,接下来在删除之前我们记得一定先备份,如下图所示。
4,然后排除重复的记录可以通过distinct字段设置,如下图所示,然后将去重的数据插入到新表中。
5,接着看到数据表下面多出来一个刚建的新表,如下图所示。
6,最后打开新表,就可以看到重复的数据都没有了,如下图所示。
问题背景
在一个多表查询的sql中正常情况下产生的数据都是唯一的,但因为数据库中存在错误(某张表中存在相同的外键ID)导致我这边查询出来的数据就会有重复的问题
下面结果集中UserID:15834存在多个
查询Sql如下:
SELECT FROM (SELECT ROW_NUMBER() OVER ( ORDER BY TUSERID asc )AS Row
,TUSERID
,TCreateTimeFROM UserInfo TLEFT JOIN DiseaseInfo i ON iUserID=TUserID
) TT WHERE TTRow between 0 AND 20 ORDER BY UserID DESC
解决方法:
参考下面新的解决方案
在网络上了解到MSSql中通过关键字“PARTITION BY”可以将查询结果集进行分区处理,然后在查询结果集时就可以过滤掉重复的记录了(如果有指定分区字段则区ID相同)
通过更改后的Sql,在Over中添加PARTITION BY TUSERID以UserID进行分区,然后在查询结果集时通过DISTINCT ROW ,过滤掉重复的分区ID号
SELECT DISTINCT ROW ,FROM (SELECT ROW_NUMBER() OVER (PARTITION BY TUSERID ORDER BY TUSERID asc )AS Row
,TUSERID
,TCreateTimeFROM UserInfo TLEFT JOIN DiseaseInfo i ON iUserID=TUserID
) TT WHERE TTRow between 0 AND 12 ORDER BY UserID DESC
查询时未过滤重复分区IDDISTINCT ROW ,下面的结果集跟上面的结果集不同(Row是进行过分区的所有有重复Row)
在查询结果集时过滤掉重复的分区ID号 DISTINCT ROW ,
新解决方案:
由于在Sqlserver中如果多表联合查询中除非所有的字段都完全相同否则在使用DISTINCT 用进行去重时还是会当成两个不同的数据集进行处理,因此DISTINCT会失效即
如下面的结果集,虽然 USERID和其他字段内容相同但HID是不相同的所以无法使用DISTINCT进行去重
出现这种问题是因为数据库设计的错误(正常情况下关联表HospitalInfo中只可能存在一条ClinicInfo表对应的记录)
Sql语句:
SELECT FROM (SELECT ROW_NUMBER() OVER ( order by TUSERID asc )AS Row
,TUSERID
,LEFT(TPatient_Tel1,5)+'00000000' AS Tel
,TCreateTime
,hHName
,hHID
fromUserInfo TLEFT JOIN ClinicInfo c ON cUserID=TUserID AND CDisabled=1LEFT JOIN HospitalInfo H ON HHID=cVisitHospital WHERE TDisabled=1AND tUserID>=17867 AND TUserID<=17875--(TPatient_Tel1 like '%13800000000%')) TT WHERETTRow between 0and20
可以看到上面的结果集中Row是有重复的,其他Row为2的是跟第一个是重复的
因为数据库涉及到其他业务和人员因此我只能提交该问题给相关的技术,但在该问题解决前不能影响到我这边也出现此问题
于是在原sql基础上进行处理,虽然HospitalInfo表中不重复记录但表的自增ID是不可能重复的那我只需要最新的一条记录即可
如果通过DISTINCT过进行去重则就无法成功,因为数据存在差别,可以看到第一条和最后一条数据还是重复的
SELECT DISTINCT row,FROM (SELECT ROW_NUMBER() OVER ( partition by TUSERID order by TUSERID asc )AS Row
,TUSERID
,LEFT(TPatient_Tel1,5)+'00000000' AS Tel
,TCreateTime
,hHName
,hHID
fromUserInfo TLEFT JOIN ClinicInfo c ON cUserID=TUserID AND CDisabled=1LEFT JOIN HospitalInfo H ON HHID=cVisitHospital WHERE TDisabled=1AND tUserID>=17867 AND TUserID<=17875--(TPatient_Tel1 like '%13800000000%')) TT WHERE--row=1 ANDTTRow between 0 and 20
更改后的Sql
SELECT FROM (--partition by TUSERID 以UserID对结果集进行分区SELECT ROW_NUMBER() OVER ( partition by TUSERID order by TUSERID asc )AS Row
,TUSERID
,LEFT(TPatient_Tel1,5)+'00000000' AS Tel
,TCreateTime
,hHName
,hHID
fromUserInfo TLEFT JOIN ClinicInfo c ON cUserID=TUserID AND CDisabled=1LEFT JOIN HospitalInfo H ON HHID=cVisitHospital WHERE TDisabled=1AND tUserID>=17867 AND TUserID<=17875--(TPatient_Tel1 like '%13800000000%')) TT WHERE--因为之前已经以UserID对结果集进行分区,所以如果存在重复的字段则row的值会不相同--row=1 ANDTTRow between 0 and 20
USERID=17867相同经过分区后会存在不同的Row值
在对结果集再次过滤时添加条件 : row=1,已经将重复记录中旧的数据过滤掉了 (HID:78)
根据新的解决方案解决了重复的问题,但又出现的新的问题即Row分区后都是重复的,而我再进行分页的时候就无效了(因为此时结果集中的Row都是为1)
解决方案:在结果集再加一层查询并加上ID号然后再对结果集进行分页处理
-- 新增一层查询解决过滤掉重复数据后无法分页的问题SELECT FROM (SELECT ROW_NUMBER() OVER (ORDER BY userid) AS RowNum,FROM (--partition by TUSERID 以UserID对结果集进行分区SELECT ROW_NUMBER() OVER ( partition by TUSERID order by TUSERID asc )AS Row
,TUSERID
,LEFT(TPatient_Tel1,5)+'00000000' AS Tel
,TCreateTime
,hHName
,hHID
fromUserInfo TLEFT JOIN ClinicInfo c ON cUserID=TUserID AND CDisabled=1LEFT JOIN HospitalInfo H ON HHID=cVisitHospital WHERE TDisabled=1AND tUserID>=17867 AND TUserID<=20875--(TPatient_Tel1 like '%13800000000%')) TT
)AS TWHERE--过滤重复数据Row=1--对结果进行分页AND RowNum between 13 and 24
参考:
MSDN: OVER 子句 (Transact-SQL)
stackoverflow sql query distinct with Row_Number
SQL Trick: row_number() is to SELECT what dense_rank() is to SELECT DISTINCT
可以采用组函数Sql来实现:
第一:可以把重复的行找出来:
select Dept_Guid,Category_Guid from 表名 group by Dept_Guid,Category_Guid havingcount()>1;
第二:把这些数据插入到一个中转表中;
SQL 略
第三:把原表中的重复数据删除;
SQL 略
第四:把备份到中转表中的唯一化之后的数据,再插入原来的表中。
SQL 略
DISTINCT 关键字可从 SELECT 语句的结果中消除重复的行。如果没有指定 DISTINCT,将返回所有行,包括重复的行。例如,如果选择 ProductInventory 中的所有产品 ID 时没有使用 DISTINCT,将返回 1069 行。\x0d\\x0d\如果使用了 DISTINCT,就可以消除重复的行,只查看唯一的产品 ID:\x0d\ \x0d\USE AdventureWorks;\x0d\GO\x0d\SELECT DISTINCT ProductID\x0d\FROM ProductionProductInventory\x0d\\x0d\此查询将返回 432 行。
首先,先说明一个问题。这样的结果出现,说明系统设计是有问题的。
其次
删除重复数据,你要提供你是什么数据库。
不同数据库会有不同的解决方案。
关键字Distinct 去除重复,如下列SQL,去除Test相同的记录;
1 select distinct Test from Table
2 如果是要删除表中存在的重复记录,那就逻辑处理,如下:
3 select Test from Table group by Test having count(test)>1
4 先查询存在重复的数据,后面根据条件删除
还有一个更简单的方法可以尝试一下:
select aid, count(distinct uid) from 表名 group by aid
这是sqlserver 的写法。
如图一在数据表中有两个膀胱冲洗重复的记录。
2
可以通过sql语句“select from 表名 where 编码 in(select 编码 from 表名 group by 编码 having count(1) >= 2)”来查询出变种所有重复的记录如图二
3
通过sql语句"
delete from 表名 where
编码 in(select 编码 from 表名 group by 编码 having count(1) >= 2)
and 编码 not in (select max(编码)from 表名 group by 编码 having count(1) >=2)
"来删除重复的记录只保留编码最大的记录
以上就是关于在SQL中怎么删除两个表中相同的数据全部的内容,包括:在SQL中怎么删除两个表中相同的数据、sql 如何过滤重复记录、sql语句去重等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)