1、表中有多条a、b字段相同的,其余字段是否相同不管。对a、b字段相同的行进行重复查询,然后只保留一条。
2、表中有多条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书啊
还有有没有什么好的sql书啊
#4
其余字段是否相同不管,然后显示出来满足条件的行
什么样的条件呢?
什么样的条件呢?
#5
就是上面图片上的,一个表,将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' 附近的语法不正确。如果它要用作公用表表达式,需要使用分号显式终止前一个语句。
'm' 附近的语法不正确。如果它要用作公用表表达式,需要使用分号显式终止前一个语句。
#8
with 前面,加一个分号;
;with m as ...
#9
可以了,真心感谢!第一次发帖就遇到好心人了,这个可以奖励回帖的人吗?第一次用,想谢谢您。
#10
楼主客气了,论坛就是一个互相学习的地方。
#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书啊
还有有没有什么好的sql书啊
#4
其余字段是否相同不管,然后显示出来满足条件的行
什么样的条件呢?
什么样的条件呢?
#5
就是上面图片上的,一个表,将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' 附近的语法不正确。如果它要用作公用表表达式,需要使用分号显式终止前一个语句。
'm' 附近的语法不正确。如果它要用作公用表表达式,需要使用分号显式终止前一个语句。
#8
with 前面,加一个分号;
;with m as ...
#9
可以了,真心感谢!第一次发帖就遇到好心人了,这个可以奖励回帖的人吗?第一次用,想谢谢您。
#10
楼主客气了,论坛就是一个互相学习的地方。