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
相关文章
|
1天前
|
SQL 关系型数据库 MySQL
|
2天前
|
SQL 关系型数据库 MySQL
|
3天前
|
SQL 数据库
Sql中如何添加数据
Sql中如何添加数据
5 0
|
7天前
|
SQL API 数据库
在Python中获取筛选后的SQL数据行数
在Python中获取筛选后的SQL数据行数
17 1
|
7天前
|
SQL 分布式计算 数据可视化
数据分享|Python、Spark SQL、MapReduce决策树、回归对车祸发生率影响因素可视化分析
数据分享|Python、Spark SQL、MapReduce决策树、回归对车祸发生率影响因素可视化分析
|
13天前
|
SQL 机器学习/深度学习 数据采集
数据分享|SQL Server、Visual Studio、tableau对信贷风险数据ETL分析、数据立方体构建可视化
数据分享|SQL Server、Visual Studio、tableau对信贷风险数据ETL分析、数据立方体构建可视化
|
13天前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在DataWorks中使用ODPS SQL时遇到"该文件对应引擎实例已失效,请重新选择可用的引擎实例"的错误提示”,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
34 0
|
13天前
|
SQL Oracle 关系型数据库
利用 SQL 注入提取数据方法总结
利用 SQL 注入提取数据方法总结
|
3天前
|
SQL 存储 数据库连接
LabVIEW与SQL Server 2919 Express通讯
LabVIEW与SQL Server 2919 Express通讯