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
相关文章
|
6天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
26天前
|
SQL 存储 关系型数据库
一文搞懂SQL优化——如何高效添加数据
**SQL优化关键点:** 1. **批量插入**提高效率,一次性建议不超过500条。 2. **手动事务**减少开销,多条插入语句用一个事务。 3. **主键顺序插入**避免页分裂,提升性能。 4. **使用`LOAD DATA INFILE`**大批量导入快速。 5. **避免主键乱序**,减少不必要的磁盘操作。 6. **选择合适主键类型**,避免UUID或长主键导致的性能问题。 7. **避免主键修改**,保持索引稳定。 这些技巧能优化数据库操作,提升系统性能。
221 4
一文搞懂SQL优化——如何高效添加数据
|
1月前
|
SQL 数据可视化 数据处理
使用SQL和Python处理Excel文件数据
使用SQL和Python处理Excel文件数据
54 0
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
6天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。
|
29天前
|
SQL 关系型数据库 MySQL
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
14 0
|
1月前
|
SQL 安全 数据库
第三章用sql语句操作数据
第三章用sql语句操作数据
10 0
|
1月前
|
SQL 存储 缓存
【SQL】Mysql中一条sql语句的执行过程
【SQL】Mysql中一条sql语句的执行过程
33 0