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
相关文章
|
11天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
27天前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
1月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
1月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
|
1月前
|
SQL 监控 数据处理
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
178 4
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
80 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
36 0
|
4月前
|
SQL JSON 数据库
influxdb 端点使用http进行sql查询,写数据
influxdb 端点使用http进行sql查询,写数据
264 0
|
1月前
|
SQL
使用SQL进行集合查询和数据维护
使用SQL进行集合查询和数据维护
34 0
|
3月前
|
SQL 存储 分布式计算