表A中有重复数据
序号:1 姓名:AA 联系代码1:00001 联系代码2:null
序号:3 姓名:AA 联系代码1:00005 联系代码2:00001
序号:5 姓名:AA 联系代码1:00001 联系代码2:00003
求语句如何能查询出重复记录的序号3、5呢?
由于数据表中有几百万条数据,所以写法需要优点。感谢!
9 个解决方案
#1
group * by having count(1)>1
#2
select 序号,姓名 from tb t where exists(
select 1 from tb where t.姓名=姓名
group by 姓名 having count(*)>1 and min(序号)<t.序号
)
select 1 from tb where t.姓名=姓名
group by 姓名 having count(*)>1 and min(序号)<t.序号
)
#3
--联系代码1重复的数据:
select a.*
from tableName a
where exists(select 1 from tablename b where b.联系代码1=a.联系代码1 and b.序号<>a.序号)
是否性能,需要结合索引来完成,如果序号作为主键的话,那么可以考虑在‘联系代码1’创建索引,
create nonclustered index ix_tablename_x1 on TableName(联系代码1)
改写查询语句:
select a.*
from tableName a with(index(ix_tablename_x1))
where exists(select 1 from tablename b where b.联系代码1=a.联系代码1 and b.序号<>a.序号)
#4
--姓名重复的数据:
select a.*
from tableName a
where exists(select 1 from tablename b where b.姓名=a.姓名 and b.序号<>a.序号)
是否性能,需要结合索引来完成,如果序号作为主键的话,那么可以考虑在‘姓名’创建索引,
create nonclustered index ix_tablename_x1 on TableName(姓名)
改写查询语句:
select a.*
from tableName a with(index(ix_tablename_x1))
where exists(select 1 from tablename b where b.姓名=a.姓名 and b.序号<>a.序号)
select a.*
from tableName a
where exists(select 1 from tablename b where b.姓名=a.姓名 and b.序号<>a.序号)
是否性能,需要结合索引来完成,如果序号作为主键的话,那么可以考虑在‘姓名’创建索引,
create nonclustered index ix_tablename_x1 on TableName(姓名)
改写查询语句:
select a.*
from tableName a with(index(ix_tablename_x1))
where exists(select 1 from tablename b where b.姓名=a.姓名 and b.序号<>a.序号)
#5
and min(序号)<t.序号 应该是 and max(序号)<t.序号吧?
#6
这个 正确 吧
先学习了
一直 不会用having
#7
lz要找出3、5,也就是重复值中比最小值大的,所以要大于min
#8
--利用分组函数进行查询
1.select * from(select ROW_NUMBER() over(partition by 序号 order by 姓名) as a,* from table) as b
where a>1
--利用group by进行查询
2.SELECT 序号, 姓名, count(*)
FROM table
GROUP BY 序号, 姓名
HAVING count(*) > 1
- -话说你应该是应聘的面试题做不下去了吧,最近几个月这个问题都被问三四次了
1.select * from(select ROW_NUMBER() over(partition by 序号 order by 姓名) as a,* from table) as b
where a>1
--利用group by进行查询
2.SELECT 序号, 姓名, count(*)
FROM table
GROUP BY 序号, 姓名
HAVING count(*) > 1
- -话说你应该是应聘的面试题做不下去了吧,最近几个月这个问题都被问三四次了
#9
4楼,8楼的楼主可以试试~
#1
group * by having count(1)>1
#2
select 序号,姓名 from tb t where exists(
select 1 from tb where t.姓名=姓名
group by 姓名 having count(*)>1 and min(序号)<t.序号
)
select 1 from tb where t.姓名=姓名
group by 姓名 having count(*)>1 and min(序号)<t.序号
)
#3
--联系代码1重复的数据:
select a.*
from tableName a
where exists(select 1 from tablename b where b.联系代码1=a.联系代码1 and b.序号<>a.序号)
是否性能,需要结合索引来完成,如果序号作为主键的话,那么可以考虑在‘联系代码1’创建索引,
create nonclustered index ix_tablename_x1 on TableName(联系代码1)
改写查询语句:
select a.*
from tableName a with(index(ix_tablename_x1))
where exists(select 1 from tablename b where b.联系代码1=a.联系代码1 and b.序号<>a.序号)
#4
--姓名重复的数据:
select a.*
from tableName a
where exists(select 1 from tablename b where b.姓名=a.姓名 and b.序号<>a.序号)
是否性能,需要结合索引来完成,如果序号作为主键的话,那么可以考虑在‘姓名’创建索引,
create nonclustered index ix_tablename_x1 on TableName(姓名)
改写查询语句:
select a.*
from tableName a with(index(ix_tablename_x1))
where exists(select 1 from tablename b where b.姓名=a.姓名 and b.序号<>a.序号)
select a.*
from tableName a
where exists(select 1 from tablename b where b.姓名=a.姓名 and b.序号<>a.序号)
是否性能,需要结合索引来完成,如果序号作为主键的话,那么可以考虑在‘姓名’创建索引,
create nonclustered index ix_tablename_x1 on TableName(姓名)
改写查询语句:
select a.*
from tableName a with(index(ix_tablename_x1))
where exists(select 1 from tablename b where b.姓名=a.姓名 and b.序号<>a.序号)
#5
and min(序号)<t.序号 应该是 and max(序号)<t.序号吧?
#6
这个 正确 吧
先学习了
一直 不会用having
#7
lz要找出3、5,也就是重复值中比最小值大的,所以要大于min
#8
--利用分组函数进行查询
1.select * from(select ROW_NUMBER() over(partition by 序号 order by 姓名) as a,* from table) as b
where a>1
--利用group by进行查询
2.SELECT 序号, 姓名, count(*)
FROM table
GROUP BY 序号, 姓名
HAVING count(*) > 1
- -话说你应该是应聘的面试题做不下去了吧,最近几个月这个问题都被问三四次了
1.select * from(select ROW_NUMBER() over(partition by 序号 order by 姓名) as a,* from table) as b
where a>1
--利用group by进行查询
2.SELECT 序号, 姓名, count(*)
FROM table
GROUP BY 序号, 姓名
HAVING count(*) > 1
- -话说你应该是应聘的面试题做不下去了吧,最近几个月这个问题都被问三四次了
#9
4楼,8楼的楼主可以试试~