sql语句 找出重复的数据(多列) SQL2005 引擎有更好的做法【转】

简介: SQL2000 sql语句找出重复的数据(多列)SELECT * FROM userInfo ORDER BY Usernameid UserName Userleavel------- ------------- -----------1 a ...
SQL2000 sql语句找出重复的数据(多列)
SELECT * FROM userInfo ORDER BY Username
id UserName Userleavel
------- ------------- -----------
1 a 1
2 a 2
6 a 3
5 b 3
3 b 1
4 c 1
7 d 4
(7 行受影响)

SELECT * FROM userInfo WHERE id IN (
SELECT MIN(id) FROM userInfo GROUP BY Username)
或者
SELECT * FROM userInfo a WHERE a.id IN
(SELECT min(id) FROM userInfo b WHERE a.UserName=b.UserName)

id UserName Userleavel
------- ------------- -----------
1 a 1
3 b 1
4 c 1
7 d 4
(4 行受影响)
SELECT * FROM userInfo WHERE id NOT in (
SELECT MIN(id) FROM userInfo GROUP BY Username)
id UserName Userleavel
------- ------------ -----------
2 a 2
5 b 3
6 a 3
(3 行受影响)
--SQL2005 引擎有更好的做法,如下:
--找出重复的记录
WITH Table_temp
AS(SELECT*,ROW_NUMBER()OVER(PARTITION BY Username ORDER BY id)AS PartitionROW_NUMBER
FROM userInfo)
SELECT*FROM Table_temp WHERE Partition ROW_NUMBER>1;
--找出被重复的记录
WITH Table_temp
AS(SELECT*,ROW_NUMBER()OVER(PARTITION BY Username ORDER BY id)AS PartitionROW_NUMBER
FROM userInfo)
SELECT*FROMTable_tempWHERE Partition ROW_NUMBER=1;

--ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
--<partition_by_clause>
--将FROM 子句生成的结果集划入应用了ROW_NUMBER 函数的分区。
--
--<order_by_clause>
--确定将ROW_NUMBER 值分配给分区中的行的顺序。
删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) (id是自增int)
一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

 

SELECT * FROM t Group By a,b
Having count(-1)>1

找出a,b两列数据一样,有重复的数据.

Having :指定组或聚合的搜索条件.HAVING 只能与 SELECT 语句一起使用。HAVING 通常在 GROUP BY 子句中使用。如果不使用 GROUP BY 子句,则 HAVING 的行为与 WHERE 子句一样。

select distinct <字段名 列表> from <表名> --找出选择列有重复的数据.
SELECT * FROM t Group By a,b --等效

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

对于 DISTINCT 关键字来说,输出取决于列的排序规则或应用 DISTINCT 的表达式,各空值将被认为是相互重复的内容。当 SELECT 语句中包括 DISTINCT 时,不论遇到多少个空值,在结果中只返回一个 NULL

·找第几条到第几条记录

sql2005数据库实例的方法,效率高
WITH TempDB AS
(SELECT <字段列表>, ROW_NUMBER() OVER (ORDER BY <字段列表> DESC) AS RowNumber FROM Db_Table where "子句")
SELECT * FROM TempDB WHERE RowNumber BETWEEN 5 AND 12
sql2000数据库实例的方法 虽然比较耗能
select top 3 EmployeeID,city,ReportsTo from Employees
where EmployeeID not in
(select top 2 EmployeeID from Employees order by EmployeeID asc)
order by EmployeeID asc --找第3到第5条记录

select top 3 EmployeeID,city,ReportsTo from Employees
where EmployeeID not in
( select top 2 EmployeeID from Employees order by EmployeeID desc)
order by EmployeeID desc --找倒数第3到第5条记录

一个比较好用的字符串分割函数。将字符串分割之后,存入表中。

使用方法:select * from (split('sssss,ss,sssss',',') 。

/*
拆分字符串,但参数不能为空或空字符串
*/

CREATE FUNCTION [dbo].[split]
(
@SourceSql varchar(8000),
@StrSeprate varchar(10)
)
returns @temp table(substr varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+len(@StrSeprate),len(@SourceSql)-len(@StrSeprate))
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end

1 --------------------------这个函数用来切割字符串的-----------------
2 --函数的参数 第一个是要切割的字符串 第二个是要以什么字符串切割
3 CREATE FUNCTION Split(@Text NVARCHAR(4000),@Sign NVARCHAR(4000))
4 RETURNS @tempTable TABLE([ID] INT IDENTITY(1,1) PRIMARY KEY,[VALUE] NVARCHAR(4000))
5 AS
6 BEGIN
7 DECLARE @StartIndex INT --开始查找的位置
8 DECLARE @FindIndex INT --找到的位置
9 DECLARE @Content VARCHAR(4000) --找到的值
10 --初始化一些变量
11 SET @StartIndex = 1 --T-SQL中字符串的查找位置是从1开始的
12 SET @FindIndex=0
13
14 --开始循环查找字符串逗号
15 WHILE(@StartIndex <= LEN(@Text))
16 BEGIN
17 --查找字符串函数 CHARINDEX 第一个参数是要找的字符串
18 -- 第二个参数是在哪里查找这个字符串
19 -- 第三个参数是开始查找的位置
20 --返回值是找到字符串的位置
21 SELECT @FindIndex = CHARINDEX(@Sign,@Text,@StartIndex)
22 --判断有没找到 没找到返回0
23 IF(@FindIndex =0 OR @FindIndex IS NULL)
24 BEGIN
25 --如果没有找到者表示找完了
26 SET @FindIndex = LEN(@Text)+1
27 END
28 --截取字符串函数 SUBSTRING 第一个参数是要截取的字符串
29 -- 第二个参数是开始的位置
30 -- 第三个参数是截取的长度
31 --@FindIndex-@StartIndex 表示找的的位置-开始找的位置=要截取的长度
32 --LTRIM 和 RTRIM 是去除字符串左边和右边的空格函数
33 SET @Content = LTRIM(RTRIM(SUBSTRING(@Text,@StartIndex,@FindIndex-@StartIndex)))
34 --初始化下次查找的位置
35 SET @StartIndex = @FindIndex+1
36 --把找的的值插入到要返回的Table类型中
37 INSERT INTO @tempTable ([VALUE]) VALUES (@Content)
38 END
39 RETURN
40 END

这个函数的作用就是类似.Net中的string类的Split方法

现在来测试这个函数

这个函数返回的是Table类型 所以可以用下面的语法来调用

SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',')

 

学习交流群:364976091
相关文章
|
3月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
简介:本文整理自阿里云高级技术专家李麟在Flink Forward Asia 2025新加坡站的分享,介绍了Flink 2.1 SQL在实时数据处理与AI融合方面的关键进展,包括AI函数集成、Join优化及未来发展方向,助力构建高效实时AI管道。
781 43
|
3月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
本文整理自阿里云的高级技术专家、Apache Flink PMC 成员李麟老师在 Flink Forward Asia 2025 新加坡[1]站 —— 实时 AI 专场中的分享。将带来关于 Flink 2.1 版本中 SQL 在实时数据处理和 AI 方面进展的话题。
278 0
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
|
4月前
|
SQL
SQL如何只让特定列中只显示一行数据
SQL如何只让特定列中只显示一行数据
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
4月前
|
SQL
SQL中如何删除指定查询出来的数据
SQL中如何删除指定查询出来的数据
|
4月前
|
SQL 关系型数据库 MySQL
SQL如何对不同表的数据进行更新
本文介绍了如何将表A的Col1数据更新到表B的Col1中,分别提供了Microsoft SQL和MySQL的实现方法,并探讨了多表合并后更新的优化方式,如使用MERGE语句提升效率。适用于数据库数据同步与批量更新场景。
|
5月前
|
SQL DataWorks 数据管理
SQL血缘分析实战!数据人必会的3大救命场景
1. 开源工具:Apache Atlas(元数据管理)、Spline(血缘追踪) 2. 企业级方案:阿里DataWorks血缘分析、腾讯云CDW血缘引擎 3. 自研技巧:在ETL脚本中植入版本水印,用注释记录业务逻辑变更 📌 重点总结: