热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

跪求sqlserver中删除根据多个字段查询出来的重复记录保留一条就可以了。

本人用的sql2000;比如表明是People,它有name,sex,age,love,marry这5个字段。例:数据如下namesexagel
本人用的sql2000;

比如 表明是 People,它有name,sex,age,love,marry 这5个字段。例:数据如下 
   name    sex     age      love         marry   
   
   张三      N      22      足球              否               
   张三      F      50    篮球              否               
   张三      N      50    篮球          否               
   赵六      F      30    上网          是               
   赵六      N      30    上网          是               
   赵六      N      30   听音乐        是        

现在根据name 和sex 两个字段查询数据,可以看到name和sex同时相同的只有 (张三 N) 和(赵六 N)。两个字段同时相同的数据只保留一条就可以了。比如(张三  N 。。。 )和(赵六 N。。。)分别保留一条数据就可以了。结果只有 张三 N  、张三 F、赵六 N、赵六 F 这四条数据了。

求sql语句。

在线等。。。

         

21 个解决方案

#1


----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-10-10 12:38:30
-- Version:
--      Microsoft SQL Server 2014 (CTP1) - 11.0.9120.5 (X64) 
-- Jun 10 2013 20:09:10 
-- Copyright (c) Microsoft Corporation
-- Enterprise Evaluation Edition (64-bit) on Windows NT 6.2  (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[People]
if object_id('[People]') is not null drop table [People]
go 
create table [People]([name] varchar(4),[sex] varchar(1),[age] int,[love] varchar(6),[marry] varchar(2))
insert [People]
select '张三','N',22,'足球','否' union all
select '张三','F',50,'篮球','否' union all
select '张三','N',50,'篮球','否' union all
select '赵六','F',30,'上网','是' union all
select '赵六','N',30,'上网','是' union all
select '赵六','N',30,'听音乐','是'
--------------开始查询--------------------------

select * from [People] a
WHERE EXISTS (SELECT 1 FROM (SELECT MAX(love)love,name,sex FROM  [People] GROUP BY name,sex)b
WHERE a.love=b.love AND a.NAME=b.NAME AND a.sex=b.sex )
----------------结果----------------------------
/* 
name sex  age         love   marry
---- ---- ----------- ------ -----
张三   N    22          足球     否
张三   F    50          篮球     否
赵六   F    30          上网     是
赵六   N    30          听音乐    是
*/

#2


SELECT [name],[sex],[age],[love],[marry]
FROM
(
SELECT *,rn=ROW_NUMBER() OVER(PARTITION BY [name],[sex] ORDER BY GETDATE()) 
FROM [People] 
) T
WHERE rn=1

#3


2000没有row_number。。。。

#4



create table People
(name varchar(10), sex varchar(10), age int, love varchar(10), marry varchar(10))

insert into People 
 select '张三', 'N', 22, '足球', '否' union all          
 select '张三', 'F', 50, '篮球', '否' union all
 select '张三', 'N', 50, '篮球', '否' union all
 select '赵六', 'F', 30, '上网', '是' union all
 select '赵六', 'N', 30, '上网', '是' union all
 select '赵六', 'N', 30, '听音乐', '是'


select distinct name,sex from People

/*
name       sex
---------- ----------
张三         F
张三         N
赵六         F
赵六         N

(4 row(s) affected)
*/


select identity(int,1,1) 'rn',* 
 into #t
 from People

select a.name,a.sex,a.age,a.love,a.marry 
 from #t a
 where not exists(select 1 from #t b
                  where b.rn
/*
name       sex        age         love       marry
---------- ---------- ----------- ---------- ----------
张三         N          22          足球         否
张三         F          50          篮球         否
赵六         F          30          上网         是
赵六         N          30          上网         是

(4 row(s) affected)
*/

#5





if object_id('[People]') is not null drop table [People]
go 
create table [People]([name] varchar(4),[sex] varchar(1),[age] int,[love] varchar(6),[marry] varchar(2))
insert [People]
select '张三','N',22,'足球','否' union all
select '张三','F',50,'篮球','否' union all
select '张三','N',50,'篮球','否' union all
select '赵六','F',30,'上网','是' union all
select '赵六','N',30,'上网','是' union all
select '赵六','N',30,'听音乐','是'
--------------开始查询--------------------------




select distinct
       p.*
from People p
inner join 
(
select name,
       sex,
       MAX(cast(age as varchar) + love + marry) as st
from People  
group by name,sex
)pp
on p.name = pp.name
   and p.sex = pp.sex
   and cast(p.age as varchar) + p.love + p.marry = pp.st
   


----------------结果----------------------------
/* 
name sex age love marry
张三     F 50 篮球 否
张三     N 50 篮球 否
赵六     F 30 上网 是
赵六     N 30 听音乐 是
*/

#6


是要删除重复的记录,不是把重复的记录查出来就可以 。

#7


是删除的操作,不是查询

#8


delete from People 
where not exists (select 1 from (select * from [People] a
WHERE EXISTS (SELECT 1 FROM (SELECT MAX(love)love,name,sex FROM  [People] GROUP BY name,sex)b
WHERE a.love=b.love AND a.NAME=b.NAME AND a.sex=b.sex )) b where People.NAME=b.name AND People.sex=b.sex AND People.age=b.age AND People.love=b.love AND People.marry=b.marry)


SELECT * FROM dbo.People

/*
name sex  age         love   marry
---- ---- ----------- ------ -----
张三   N    22          足球     否
张三   F    50          篮球     否
赵六   F    30          上网     是
赵六   N    30          听音乐    是

*/

#9


不用什么都写的那么清楚吧,把不再查出来的数据里面的数据删除就可以拉

#10


你这回复速度太慢了吧...都3个小时了,以为又是没有回复的贴

#11


要得,麻烦帮忙把删除的语句写出来好吗

#12


8楼的你测测,先备份一下以免出错

#13


多谢,但是我的数据库真正的字段有20多个,where后面不会要加20多个吧

#14


其实只要写主键就可以了

#15


引用 8 楼 DBA_Huangzj 的回复:
delete from People 
where not exists (select 1 from (select * from [People] a
WHERE EXISTS (SELECT 1 FROM (SELECT MAX(love)love,name,sex FROM  [People] GROUP BY name,sex)b
WHERE a.love=b.love AND a.NAME=b.NAME AND a.sex=b.sex )) b where People.NAME=b.name AND People.sex=b.sex AND People.age=b.age AND People.love=b.love AND People.marry=b.marry)


SELECT * FROM dbo.People

/*
name sex  age         love   marry
---- ---- ----------- ------ -----
张三   N    22          足球     否
张三   F    50          篮球     否
赵六   F    30          上网     是
赵六   N    30          听音乐    是

*/

#16


下次引用一下回复

#17


引用 16 楼 DBA_Huangzj 的回复:
下次引用一下回复

  首先声明一下,这些是测试的数据。
 我看你用到了max(love)这个函数,但是在真正的数据库里面的比如love字段不一定是有值的。我想有没有通用的方法。

#18


本来我想用age的但是发现有重复数据所以不用,你还是给实际数据吧

#19


应该用联合主键防止这类数据的产生,下面的 SQL 通过循环删除复制数据:
while 1=1 
begin
delete top (1) from People
from People a join ( select name,sex from People group by name,sex having COUNT(*)>1 ) b
on a.name=b.name and a.sex=b.sex
if @@ROWCOUNT=0 break;
end;

#20



create table People
(name varchar(10), sex varchar(10), age int, love varchar(10), marry varchar(10))
 
insert into People 
 select '张三', 'N', 22, '足球', '否' union all             
 select '张三', 'F', 50, '篮球', '否' union all
 select '张三', 'N', 50, '篮球', '否' union all
 select '赵六', 'F', 30, '上网', '是' union all
 select '赵六', 'N', 30, '上网', '是' union all
 select '赵六', 'N', 30, '听音乐', '是'
 
 

select identity(int,1,1) 'rn',* 
 into #t
 from People

truncate table People

insert into People
select a.name,a.sex,a.age,a.love,a.marry 
 from #t a where not exists(select 1 from #t b
                            where b.rn
select * from People

/*
name       sex        age         love       marry
---------- ---------- ----------- ---------- ----------
张三         N          22          足球         否
张三         F          50          篮球         否
赵六         F          30          上网         是
赵六         N          30          上网         是

(4 row(s) affected)
*/

#21


hi,可否帮忙写个SQL语句,大概情况如下:
delete from [test].dbo.[awot_login] a where (a.userid,a.oper_datetime) in (select userid,oper_datetime from [test].dbo.[awot_login] group by userid,oper_datetime having count(*) > 1)
想删除相同的userid和oper_datetime,但要保留一条记录的语句,上面哪个语句当然是不行,只是给你知道表名和名称



引用 8 楼 DBA_Huangzj 的回复:
delete from People 
where not exists (select 1 from (select * from [People] a
WHERE EXISTS (SELECT 1 FROM (SELECT MAX(love)love,name,sex FROM  [People] GROUP BY name,sex)b
WHERE a.love=b.love AND a.NAME=b.NAME AND a.sex=b.sex )) b where People.NAME=b.name AND People.sex=b.sex AND People.age=b.age AND People.love=b.love AND People.marry=b.marry)


SELECT * FROM dbo.People

/*
name sex  age         love   marry
---- ---- ----------- ------ -----
张三   N    22          足球     否
张三   F    50          篮球     否
赵六   F    30          上网     是
赵六   N    30          听音乐    是

*/

推荐阅读
  • oracle text db2,从Oracle 到DB2(一)
    在实际的软件项目的开发过程中,特别是在企业的应用系统集成(EAI)项目中广大开发人员经常遇到不同关系型数据库之间的数据移植问题。笔者根据自己在工作中的不同数据库数据移 ... [详细]
  • 关于SQLSERVER的全文目录跟全文索引的区别
    很久没有写随笔了,本来之前想写一篇关于SQLSERVER全文索引的随笔,可惜没有时间,一直拖到现在才有时间写,不好意思让各位久等了~先介绍一下SQLSERVER中的存储类对象,哈哈,先介绍一下概念嘛 ... [详细]
  • 定制数据层关键字:数据层,访问,元数据,数据访问模型http://www.gaodaima.com/35448.html定制数据层_sqlserver ... [详细]
  • 假设我有一张源表customer_account中有一个字段crm_id_content,字段的内容大概为这种模式<r><uid{F7898717-4954-E123 ... [详细]
  • sqldouble222.22222222如何转换成字符串222.22222222%convertcast都是保留4位小数。 ... [详细]
  • 转载:http:www.crazycoder.cnDataBaseIndex.html查询速度慢的原因很多,常见如下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设 ... [详细]
  • 本文主要介绍关于数据库,sql,sqlserver的知识点,对【数据库——概述】和【数据库到底要怎么做】有兴趣的朋友可以看下由【用编程写诗】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的数据库相 ... [详细]
  • Java工作流引擎关于数据加密流程(MD5数据加密防篡改)
    关键字:驰骋工作流程快速开发平台工作流程管理系统工作流引擎asp.net工作流引擎java工作流引擎.开发者表单拖拽式表单工作流系统流程数据加密md5数据保密流程数据防篡改软加密适 ... [详细]
  • 第一部分:TSqlTop有两种用法1,限制查询结果集返回的行数或总行数的百分比。当将TOP与ORDERBY子句结合使用时,结果集限制为前N个已排序行;否则,以未定义的顺序返回前N个 ... [详细]
  • linux json 写sql注入,sql注入之json注入(php代码)
    环境phpstudyphp服务端代码security数据库中的users表中的username,password字段用户名adminJSON服务端代码大家实际测试中注 ... [详细]
  • 查询Oracle正在执行和执行过的SQL语句(一) v$session 表的权限
    2019独角兽企业重金招聘Python工程师标准oracle触发器中用v_$session问题讨论在非系统用户底下建触发器时引用v$session记录类型时出现问题错误&#x ... [详细]
  • ---------建表 table1,tabel2---------createtabletable1(idint,namevarchar(20))createtabletable2(i ... [详细]
  • 1.EF跟LINQ不是一码事儿。2.LINQtoEF是LINQ的一个provider,LINQtoSQL也是LINQ的一个provider。LINQtoEF是LINQtoSQL的替 ... [详细]
  • 使用ffmpeg进行视频格式转换的简单例子2006-12-1623:12主要参考FFMPEG里面的apiexample.c以及output_example.c编写intmain(in ... [详细]
  • 6.1WMLScript规则这些标准函数库提供一个扩展WMLScript语言的机制,这些 ... [详细]
author-avatar
厦禾Jimmy_218
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有