sql server 查询去掉重复记录

本文介绍了一种SQL技巧,用于从数据库表中去除重复记录的方法,特别是当姓名作为判断依据时。提供了三种不同的SQL查询方式来实现去重,并比较了它们的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.    if exists(select * from sysobjects where name='stuInfo')  

2.    drop table stuInfo  

3.    create table stuInfo /*创建学员信息表**/  

4.    (  

5.     stuName varchar(20) not null,-- 姓名,非空  

6.     stuNo char(6) not null,-- 学号,非空  

7.     stuAge int not null,-- 年齡,int 默认为4个长度  

8.     stuId numeric(18,0),  

9.     stuSeat smallint ,-- 坐位  

10.   stuAddress text -- 住址 可以为空  

11.  )  

12.  -- stuInfo添加一列  

13.  alter table stuInfo add id int identity(1,1) primary key;  

if exists(select * from sysobjects where name='stuInfo')
drop table stuInfo
create table stuInfo /*创建学员信息表**/
(
 stuName varchar(20) not null,-- 姓名,非空
 stuNo char(6) not null,-- 学号,非空
 stuAge int not null,-- 年齡,int 默认为4个长度
 stuId numeric(18,0),
 stuSeat smallint ,-- 坐位
 stuAddress text -- 住址 可以为空
)
-- stuInfo添加一列
alter table stuInfo add id int identity(1,1) primary key;


需求:只要数据stuName 相同,则说明是两条重复的记录

以下为去重方法。三个方法。效率1 >2>3 推荐使用第一条

[sql] view plain copy print?

1.    Select * from stuinfo a where not exists(select 1 from stuinfo where stuName=a.stuName and ID<a.ID)  

2.    select a.* from stuinfo a join (select min(ID)ID,stuName from stuinfo group by stuName) b on a.stuName=b.stuName and a.ID=b.ID  

3.    select * from stuinfo a where ID=(select min(ID) from stuinfo where stuName=a.stuName)  

Select * from stuinfo a where not exists(select 1 from stuinfo where stuName=a.stuName and ID<a.ID)
select a.* from stuinfo a join (select min(ID)ID,stuName from stuinfo group by stuName) b on a.stuName=b.stuName and a.ID=b.ID
select * from stuinfo a where ID=(select min(ID) from stuinfo where stuName=a.stuName)


结果

<think>嗯,用户问的是如何在SQL Server中去除重复行的查询语句示例。首先,我需要回想一下SQL Server中处理重复数据的常用方法。常见的有使用DISTINCT关键字,但DISTINCT是针对所有去重,如果只需要根据部分去重,可能需要其他方法。 比如,使用ROW_NUMBER()窗口函数,按指定分组为每行生成序号,然后选择序号为1的行。这种方法适用于需要保留最新或特定的一条录的情况。比如,用户可能有一个订单,每个客户有多个订单,他们想保留每个客户最近的订单,这时候可以用ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY OrderDate DESC)来排序,然后取rn=1的录。 另外,GROUP BY也可以用来去重,结合聚合函数,比如MAX或MIN,来保留需要的值。但这种方法可能只适用于数值型或日期型的,对于其他类型的可能不太方便。 还有可能用户提到的重复行是完全相同的所有,这时候直接使用SELECT DISTINCT * FROM 名就可以了。但如果重复行的某些不同,需要根据业务逻辑决定保留哪一行,这时候ROW_NUMBER()会更合适。 用户提供的引用中有提到跨数据库更新和统计选修人数的例子,虽然不直接相关,但可能涉及到JOIN和GROUP BY的使用,这些在处理重复数据时也可能用到。比如,在统计人数时用了GROUP BY和HAVING,这可能对用户处理重复数据后的统计有帮助。 另外,需要注意用户的问题是关于查询语句,而不是删除重复数据,所以应该使用SELECT而不是DELETE。但可能需要说明如何删除重复数据,不过用户没有提到,所以暂时先集中在查询上去重。 总结下来,回答应该包括几种方法:DISTINCT、ROW_NUMBER()配合CTE或子查询、GROUP BY。需要给出示例,说明适用场景,帮助用户理解不同情况下的选择。同时,可能生成相关问题,比如如何删除重复行、处理部分重复的情况,或者性能优化的问题。</think>在SQL Server中去除重复行的查询可以通过以下方法实现: ### 方法1:使用DISTINCT关键字(全去重) ```sql SELECT DISTINCT * FROM 名 ``` 适用场景:当所有内容完全重复时使用[^2] ### 方法2:使用ROW_NUMBER()窗口函数(部分去重) ```sql WITH CTE AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY 1, 2 -- 指定判断重复 ORDER BY 排序 DESC -- 指定保留行的排序依据 ) AS rn FROM 名 ) SELECT * FROM CTE WHERE rn = 1 ``` 适用场景:当需要根据指定判断重复,且需要保留最新/最旧录时使用[^1] ### 方法3:使用GROUP BY(聚合处理) ```sql SELECT 1, 2, MAX(需要保留的) FROM 名 GROUP BY 1, 2 ``` 适用场景:当重复行有需要聚合处理的数值型数据时使用 ### 完整示例(保留最新录): ```sql -- 创建测试 CREATE TABLE SalesRecords ( OrderID INT, CustomerID INT, OrderDate DATE, Amount DECIMAL(10,2) ); -- 插入测试数据 INSERT INTO SalesRecords VALUES (1, 101, '2023-01-01', 500), (2, 101, '2023-01-05', 700), (3, 102, '2023-01-02', 300); -- 查询每个客户最新订单 WITH LatestOrders AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY CustomerID ORDER BY OrderDate DESC ) AS rn FROM SalesRecords ) SELECT OrderID, CustomerID, OrderDate, Amount FROM LatestOrders WHERE rn = 1; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值