【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

news2024/12/25 23:39:51

欢迎来到《小5讲堂》,大家好,我是全栈小5。
这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解,
特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

在这里插入图片描述

目录

  • 前言
  • 创建表
  • 模拟数据
  • 分组查询
  • while实现
  • 游标实现
    • 输出编号
    • 结合临时表
  • 知识点
    • 游标(Cursor):
    • 临时表(Temporary Table):
  • 文章推荐

前言

最近在进行历史数据处理,刚开始是想着通过在后端写个逻辑处理,也非常简单。
对于数据库而言,通过sql语句处理就是最好的,方便下次再处理时有个sql语句参考,
或者也方便运维人员直接使用,后端代码逻辑处理运维人员并不一定都懂。
因此,本篇文章将模拟批量数据进行sql语句遍历处理。

创建表

创建一张学生城市表,主要字段如下

-- 创建学生城市表
create table student_table
(
    id int identity(1,1),
    name_value nvarchar(50),
    city_value nvarchar(50),
    city_value_temp nvarchar(50),
    create_time datetime default getdate()
)

模拟数据

模拟添加10条记录数据,且设置几条重复记录

-- 模拟10条记录
insert into student_table(name_value,city_value) values
('张三','广州'),
('张三','广州'),
('张三','广州'),
('李四','深圳'),
('李四','深圳'),
('王五','佛山'),
('刘六','佛山'),
('刘六','佛山'),
('张七','东莞'),
('吴八','惠州')

在这里插入图片描述

分组查询

按学生和城市分组查询,且having筛选有重复记录的数据

-- 学生和城市分组查询 - 有重复记录的数据
select name_value,city_value,count(1) repeatcount,max(id) maxid
from student_table 
group by name_value,city_value having count(1)>1

在这里插入图片描述

while实现

进行两次while遍历,然后将学生重复的城市值,除了编号最大那条记录外,其他重复记录则加序号值并赋值到city_value_temp字段里
在这里插入图片描述
1)定义变量表 - 保存重复的学生记录
2)定量变量
3)将源表中的数据插入到表变量中
4)第一层遍历
5)第一层,每次都获取第一条记录
6)定义变量表 - 保存当前学生重复记录
7)第二层遍历
8)第二层,每次都获取第一条记录
9)将当前第二层遍历记录移除
10)更新表字段
11)将当前第一层遍历记录移除


-- =====遍历处理重复数据 - 编写处理逻辑=====
-- 定义变量表 - 保存重复的学生记录
declare @temp_one_table table
(
    name_value nvarchar(50),
    city_value nvarchar(50),
    repeatcount int,
    maxid int
)

-- 定量变量
declare @maxid int
declare @name_value varchar(50)
declare @city_value varchar(50)

-- 将源表中的数据插入到表变量中
insert into @temp_one_table(name_value,city_value,repeatcount,maxid)
select name_value,city_value,count(1) repeatcount,max(id) maxid
from student_table 
group by name_value,city_value having count(1)>1

-- 第一层遍历
while exists(select city_value from @temp_one_table) begin
    
    -- 每次都获取第一条记录
    select top 1 @maxid=maxid,@name_value=name_value,@city_value=city_value from @temp_one_table
    --print(@name_value)

    -- 定义变量表 - 保存当前学生重复记录
    declare @temp_two_table table
    (
        id int,
        name_value nvarchar(50),
        city_value nvarchar(50),
        create_time datetime
    )
    insert into @temp_two_table(id,name_value,city_value,create_time)
    select id,name_value,city_value,create_time from student_table 
    where name_value=@name_value and city_value=@city_value

    -- 第二层遍历
    declare @id int
    while exists(select id from @temp_two_table) begin
                -- 第二层,每次都获取第一条记录
        select top 1 @id=id from @temp_two_table
        print(@name_value+convert(varchar,@id))
        -- 将当前第二层遍历记录移除
        delete from @temp_two_table where id=@id
        -- 更新表字段
        if @id!=@maxid begin
            update student_table set city_value_temp=(@city_value+convert(varchar,@id)) where id=@id
        end
    end

    -- 将当前第一层遍历记录移除
    delete from @temp_one_table where name_value=@name_value and city_value=@city_value
end
select * from student_table
-- =====/遍历处理重复数据 - 编写处理逻辑=====

游标实现

输出编号

下面举例通过游标遍历,逐行输出编号值
在这里插入图片描述

-- 定义变量
declare @id int

-- 定义游标并赋值
declare cursor_name cursor for
select id from student_table

-- 打开游标
open cursor_name

-- 逐行获取数据
fetch next from cursor_name into @id
while @@fetch_status=0 begin
    
    print(@id)
    -- 下一条记录
    fetch next from cursor_name into @id
end

结合临时表

在这里插入图片描述
1)定义变量
2)定义游标并赋值
3)打开游标
4)逐行获取数据
5)创建局部临时表
6)第二层遍历
7)将当前第二层遍历记录移除
8)更新表字段
9)下一条记录
10)关闭游标
11)释放游标


-- 定义变量
declare @name_value nvarchar(50)
declare @city_value nvarchar(50)
declare @repeatcount int
declare @maxid int


-- 定义游标并赋值
declare cursor_name cursor for
select name_value,city_value,count(1) repeatcount,max(id) maxid
from student_table 
group by name_value,city_value having count(1)>1

-- 打开游标
open cursor_name

-- 逐行获取数据
fetch next from cursor_name into @name_value,@city_value,@repeatcount,@maxid
while @@fetch_status=0 begin
    
    --print(@name_value)

    -- 创建局部临时表并赋值
    drop table #temp_table
    create table #temp_table
    (
        id int,
        name_value nvarchar(50),
        city_value nvarchar(50),
        create_time datetime
    )
    insert into #temp_table(id,name_value,city_value,create_time)
    select id,name_value,city_value,create_time from student_table 
    where name_value=@name_value and city_value=@city_value

    -- 第二层遍历
    declare @id int
    while exists(select id from #temp_table) begin
        select top 1 @id=id from #temp_table
        print(@name_value+convert(varchar,@id))
        -- 将当前第二层遍历记录移除
        delete from #temp_table where id=@id
        -- 更新表字段
        if @id!=@maxid begin
            update student_table set city_value_temp=(@city_value+convert(varchar,@id)),remark='游标加临时表处理' where id=@id
        end
    end

    -- 下一条记录
    fetch next from cursor_name into @name_value,@city_value,@repeatcount,@maxid
end

 -- 关闭游标
close cursor_name
-- 释放游标
deallocate cursor_name
select * from student_table

知识点

在 SQL Server 中,游标和临时表都是用于处理数据的工具,但它们的使用方式和目的略有不同。

游标(Cursor):

游标是一种用于逐行处理数据的数据库对象。通常在需要逐行访问数据并执行复杂操作时使用。游标可以使用以下步骤创建和操作:

  • 声明游标:定义一个游标并指定查询的结果集。
  • 打开游标:执行查询并将结果集放入游标中。
  • 逐行获取数据:使用 FETCH 语句一次从游标中获取一行数据。
  • 处理数据:对获取的数据进行操作。
  • 关闭游标:处理完数据后关闭游标,释放资源。
    示例:
DECLARE @id INT
DECLARE cursor_name CURSOR FOR
SELECT id FROM table_name

OPEN cursor_name
FETCH NEXT FROM cursor_name INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
    -- Process data
    FETCH NEXT FROM cursor_name INTO @id
END

CLOSE cursor_name
DEALLOCATE cursor_name

临时表(Temporary Table):

临时表是一种临时存储数据的表,它们一般用于在当前会话中临时存储和处理数据。SQL Server 提供了两种类型的临时表:全局临时表和局部临时表。

  • 局部临时表:以 # 开头,在当前会话中可见,在会话结束时自动删除。
  • 全局临时表:以 ## 开头,对所有会话可见,当创建它的会话结束时自动删除。
    示例:
-- 创建局部临时表

CREATE TABLE #temp_table (
    id INT,
    name VARCHAR(50)
)

-- 插入数据

INSERT INTO #temp_table VALUES (1, 'Alice'), (2, 'Bob')

-- 查询数据

SELECT * FROM #temp_table

-- 删除临时表(在会话结束时会自动删除)

DROP TABLE #temp_table

游标用于逐行处理数据,适用于复杂逐行操作;而临时表用于临时存储和处理数据,适用于需要临时保存中间结果的情况。
在实际应用中,要根据具体需求选择合适的工具来处理数据。

文章推荐

【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点

【Sql Server】Update中的From语句,以及常见更新操作方式

【Sql server】假设有三个字段a,b,c 以a和b分组,如何查询a和b唯一,但是c不同的记录

【Sql Server】新手一分钟看懂在已有表基础上修改字段默认值和数据类型

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1523461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言案例03-流程控制-if语句

c语言打卡-流程控制-if语句 一.在 C/C,if 函数或关键字具有判断功能,而判断这一操作必须基于给定条件,同样的,程序中使用 if 函数同样需要将判断条件作为参数传入,描述判断条件的代码语句简称为条件语句。如同现实生活…

【Python编程基础】第一节.Python基本语法(上)

文章目录 前言⼀、Python介绍二、Python环境配置三、Pycharm 书写代码四、Python基本语法 4.1 print 函数的简单使用 4.2 注释 4.3 Python 代码中三种波浪线和 PEP8 4.4 在 cmd 终端中运⾏ Python 代码 4.5 变量 4.6 数据类型 4.7 类型转换…

数码管的静态显示(二)

1.原理 要按照上图的顺序传递位选和段选的数据。 因为q0是最高位,共阳极数码管结构是dp....a,所以应该先传入低位a,而a在上图中的8段2进制编码中是seg[7],所以段选信号的顺序是seg[0],...seg[7]。 因为输出信号是两个时钟&#x…

裁员潮下,打工人的自我修养

法律规定的 裁员补偿: 1、平等协商解除的,底线是N1,上限能谈多少法律都支持 2、有客观原因解除的,是N1 3、强制违法辞退的,是2N Tips:基数是每月的全额税前工资,包括奖金绩效等&#xff0c…

光伏电站信息化管理系统如何优化能源管理

随着可再生能源的快速发展,光伏电站作为其中的重要组成部分,其运营管理面临着越来越多的挑战。为了提升光伏电站的能源管理效率,信息化管理系统成为了不可或缺的工具,那么如何优化能源管理呢? 1.数据实时监控 信息化管…

GPU密集型计算性能优化的方法和技术

对GPU密集型计算进行性能优化的方法和技术多种多样。通过一些优化策略和技术需要综合考虑应用程序的具体需求、所使用的GPU硬件、以及编程模型和库的选择。通过不断地分析和调整,可以实现GPU计算性能的持续提升。以下是一些常用的优化策略和技术: 算法优…

论文阅读——EarthPT

EarthPT: a time series foundation model for Earth Observation 一个Earth Observation (EO)预训练的Transformer。EarthPT是一个7亿参数解码Transformer基础模型,以自回归自监督方式进行训练,并专门针对EO用例进行开发。我们证明了EarthPT是一个有效的…

尚硅谷vue全家桶(上)

vue2 简介第一天第二天 第三天第四天第五天 第六天第七天第八天 第九天 网课链接(半个月拿下) 简介 需要提前会的东西 中文文档链接点下面 vue.js 要会查文档用API 第一天 清除提示1 再文档中下载开发版本浏览器安装vue devtools插件 打开允许访问URL…

【网络编程基础(一)】网络基础和SOCKET

这里写目录标题 1、网络三要素2、IPV4和IPV6区别3、网络交互3.1、交互模型图3.2、基础通信协议3.3、OSI参考模型与TCP/IP参考模型对应关系 4、SOCKET网络套接字4.1、SOCKET分类4.2、基于流式套接字的编程流程4.3、网络通信雏形4.4、socket函数4.4.1、socket函数示例 4.5、bind函…

小红书图片怎么提取?小红书图片提取原图方法!

说到小红书,不少女性群体都知道这个,他的价值很高而且变现对于大多数做自媒体的小伙伴来说,也是不错的选择! 小红书对于普通大众还是互联网创作者来说,都太实用了,唯一的缺点可能就是当我们需要存储他的图…

计算机设计大赛 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基…

基于springboot+vue实现药品信息管理系统项目【项目源码+论文说明】

基于springbootvue实现药品信息管理系统演示 摘要 本文介绍了一种基于SpringBoot的药品信息管理系统的设计与实现。该系统旨在提高药品管理的效率和准确性,包括药品信息的录入、修改、查询和删除、药品入库、出库等功能。该系统采用了SpringBoot框架、MySQL数据库、…

如何快速搭建物联网工业云平台

随着物联网技术的快速发展,物联网工业云平台已经成为推动工业领域数字化转型的重要引擎。合沃作为专业的物联网云服务提供商,致力于为企业提供高效、可靠的物联网工业云平台解决方案。本文将深入探讨物联网工业云平台的功能、解决行业痛点的能力以及如何…

用户数据的FLASH存储与应用(FPGA架构)

该系列为神经网络硬件加速器应用中涉及的模块接口部分,随手记录,以免时间久了遗忘。 一 背景 我们知道,在FPGA做神经网络应用加速时,涉及到权重参数的存储和加载。通常在推理过程中,会将权重参数存储在外部DDR或片上S…

WAAP全站防护是什么,有什么作用

WAAP全站防护是基于风险管理和WAAP理念打造的安全方案,以“体系化主动安全” 取代安全产品的简单叠加,为各类Web、API业务等防御来自网络层和应用层的攻击,帮助企业全面提升Web安全水位和安全运营效率。 主要的特性在于: 1.全周…

19双体系Java学习之数组的Arrays类

数组的Arrays类 ★小贴士 sort方法对数组进行排序,方法调用完成后,数组按升序排列。 binarySearch方法对数组进行二分查找,如果能找到需要查找的元素则返回该元素的下标,否则返回一个负数,详见binarySearch的范例代码。…

CSS:mix-blend-mode 颜色混合

一、属性 mix-blend-mode: normal; //正常 mix-blend-mode: multiply; //正片叠底 mix-blend-mode: screen; //滤色 mix-blend-mode: overlay; //叠加 mix-blend-mode: darken; //变暗 mix-blend-mode: lighten; //变亮 mi…

取钱——动态规划

题目链接:1.取钱 - 蓝桥云课 (lanqiao.cn) 用动态规划的方法,定义一个dp数组,存放从0开始的取钱所需要的钞票数(0就是取0元,所以钞票数也是0) package lanqiao;import java.util.Arrays; import j…

AI视频混剪定时发送|罐头鱼AI视频矩阵获客

AI视频混剪定时发送系统:智能化视频创作与发布一体化解决方案 随着数字内容的快速增长,视频已成为各行业推广和传播的首选方式。然而,许多人在制作高质量视频时面临挑战。现在,有了全新的AI视频混剪定时发送系统,您可以…

二叉树OJ练习

本文旨在讲解有关二叉树的OJ题目,希望读完本文,能让读者都二叉树有更深一步的认识! 正文开始! 106. 根据二叉树创建字符串 算法思想: 根据题目的输出结果,可以观察出如下规律! 1.若左右结点都…