sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?

时间:2021-03-19 15:36:59
 如题:我要实现两个功能;
1、表中有多条a、b字段相同的,其余字段是否相同不管。对a、b字段相同的行进行重复查询,然后只保留一条。
2、表中有多条a字段相同,b字段不同的,其余字段是否相同不管,然后显示出来满足条件的行 sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?

11 个解决方案

#1


-- 第一题:

create table test(a int, b int, c int, d int)
go
insert into test values
(1,1,1,1),(1,1,2,3),(1,1,2,1),(1,1,3,4),
(2,2,2,1),(2,2,2,3),(3,3,2,1),(3,3,3,4)
go
print '删除前'
select * from test 
go
with m as (
select row_number() over(partition by a, b order by (select 1)) rn, * 
from test 
)
delete m where rn > 1
go
print '删除后'
select * from test 
go
drop table test 
go



(8 行受影响)
删除前
a           b           c           d
----------- ----------- ----------- -----------
1           1           1           1
1           1           2           3
1           1           2           1
1           1           3           4
2           2           2           1
2           2           2           3
3           3           2           1
3           3           3           4

(8 行受影响)


(5 行受影响)
删除后
a           b           c           d
----------- ----------- ----------- -----------
1           1           1           1
2           2           2           1
3           3           2           1

(3 行受影响)

#2


如果只是显示一下,把 delete m where rn > 1 换成 select * from where rn = 1 就可以了

第二题,参考第一题就可以了

#3


抱歉打扰了,因为是初学者,第二题也不会,能麻烦直接写一下式子吗?

还有有没有什么好的sql书啊

#4


其余字段是否相同不管,然后显示出来满足条件的行

什么样的条件呢?

#5


sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?

就是上面图片上的,一个表,将B字段相同,C字段不同的显示出来,处理过后应该就只剩前两行,按照您刚才第一题的方法,我不会弄,麻烦您了。

#6



create table test(a int, b varchar(10), c varchar(10))
go
insert into test values
(1,'王','快乐'),(2,'王','美丽'),(3,'牛','你的'),(4,'猪','我的')
go
-- 方法 1
select * from test 
where b in (select b from test group by b having count(*) > 1)
go
-- 方法 2,这个效率在数据量大时,会有问题
with m as (
select count(*) over(partition by b) rscount, * from test 
)
select * from m where rscount > 1 
go

drop table test 
go


(4 行受影响)
a           b          c
----------- ---------- ----------
1           王          快乐
2           王          美丽

(2 行受影响)

rscount     a           b          c
----------- ----------- ---------- ----------
2           1           王          快乐
2           2           王          美丽

(2 行受影响)


#7


嗯嗯 感谢,感谢  就是刚才第一题,您给我的程序段,我写成一排过后在去处理数据时就出现了下面的一段话

'm' 附近的语法不正确。如果它要用作公用表表达式,需要使用分号显式终止前一个语句。

#8


引用 7 楼 xiaozhuer000 的回复:
嗯嗯 感谢,感谢  就是刚才第一题,您给我的程序段,我写成一排过后在去处理数据时就出现了下面的一段话

'm' 附近的语法不正确。如果它要用作公用表表达式,需要使用分号显式终止前一个语句。


with 前面,加一个分号;

;with m as ... 

#9


可以了,真心感谢!第一次发帖就遇到好心人了,这个可以奖励回帖的人吗?第一次用,想谢谢您。

#10


引用 9 楼 xiaozhuer000 的回复:
可以了,真心感谢!第一次发帖就遇到好心人了,这个可以奖励回帖的人吗?第一次用,想谢谢您。


楼主客气了,论坛就是一个互相学习的地方。  sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?

#11


sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?

#1


-- 第一题:

create table test(a int, b int, c int, d int)
go
insert into test values
(1,1,1,1),(1,1,2,3),(1,1,2,1),(1,1,3,4),
(2,2,2,1),(2,2,2,3),(3,3,2,1),(3,3,3,4)
go
print '删除前'
select * from test 
go
with m as (
select row_number() over(partition by a, b order by (select 1)) rn, * 
from test 
)
delete m where rn > 1
go
print '删除后'
select * from test 
go
drop table test 
go



(8 行受影响)
删除前
a           b           c           d
----------- ----------- ----------- -----------
1           1           1           1
1           1           2           3
1           1           2           1
1           1           3           4
2           2           2           1
2           2           2           3
3           3           2           1
3           3           3           4

(8 行受影响)


(5 行受影响)
删除后
a           b           c           d
----------- ----------- ----------- -----------
1           1           1           1
2           2           2           1
3           3           2           1

(3 行受影响)

#2


如果只是显示一下,把 delete m where rn > 1 换成 select * from where rn = 1 就可以了

第二题,参考第一题就可以了

#3


抱歉打扰了,因为是初学者,第二题也不会,能麻烦直接写一下式子吗?

还有有没有什么好的sql书啊

#4


其余字段是否相同不管,然后显示出来满足条件的行

什么样的条件呢?

#5


sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?

就是上面图片上的,一个表,将B字段相同,C字段不同的显示出来,处理过后应该就只剩前两行,按照您刚才第一题的方法,我不会弄,麻烦您了。

#6



create table test(a int, b varchar(10), c varchar(10))
go
insert into test values
(1,'王','快乐'),(2,'王','美丽'),(3,'牛','你的'),(4,'猪','我的')
go
-- 方法 1
select * from test 
where b in (select b from test group by b having count(*) > 1)
go
-- 方法 2,这个效率在数据量大时,会有问题
with m as (
select count(*) over(partition by b) rscount, * from test 
)
select * from m where rscount > 1 
go

drop table test 
go


(4 行受影响)
a           b          c
----------- ---------- ----------
1           王          快乐
2           王          美丽

(2 行受影响)

rscount     a           b          c
----------- ----------- ---------- ----------
2           1           王          快乐
2           2           王          美丽

(2 行受影响)


#7


嗯嗯 感谢,感谢  就是刚才第一题,您给我的程序段,我写成一排过后在去处理数据时就出现了下面的一段话

'm' 附近的语法不正确。如果它要用作公用表表达式,需要使用分号显式终止前一个语句。

#8


引用 7 楼 xiaozhuer000 的回复:
嗯嗯 感谢,感谢  就是刚才第一题,您给我的程序段,我写成一排过后在去处理数据时就出现了下面的一段话

'm' 附近的语法不正确。如果它要用作公用表表达式,需要使用分号显式终止前一个语句。


with 前面,加一个分号;

;with m as ... 

#9


可以了,真心感谢!第一次发帖就遇到好心人了,这个可以奖励回帖的人吗?第一次用,想谢谢您。

#10


引用 9 楼 xiaozhuer000 的回复:
可以了,真心感谢!第一次发帖就遇到好心人了,这个可以奖励回帖的人吗?第一次用,想谢谢您。


楼主客气了,论坛就是一个互相学习的地方。  sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?

#11


sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?sql表中有6个字段,先将a、b字段相同的去重,然后查询a字段相同,b字段不同的行,怎么弄?