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
相关文章
|
17天前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
35 9
|
9天前
|
SQL 容灾 关系型数据库
阿里云DTS踩坑经验分享系列|DTS打通SQL Server数据通道能力介绍
SQL Server 以其卓越的易用性和丰富的软件生态系统,在数据库行业中占据了显著的市场份额。作为一款商业数据库,外部厂商在通过解析原生日志实现增量数据捕获上面临很大的挑战,DTS 在 SQL Sever 数据通道上深研多年,提供了多种模式以实现 SQL Server 增量数据捕获。用户可以通过 DTS 数据传输服务,一键打破自建 SQL Server、RDS SQL Server、Azure、AWS等他云 SQL Server 数据孤岛,实现 SQL Server 数据源的流动。
69 0
阿里云DTS踩坑经验分享系列|DTS打通SQL Server数据通道能力介绍
|
25天前
|
SQL 关系型数据库 分布式数据库
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
|
2月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
462 11
|
2月前
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
170 0
|
4月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
4月前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
125 4
|
5月前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
5月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
|
5月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录

热门文章

最新文章