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

欢迎来到《小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 intwhile exists(select id from @temp_two_table) begin-- 第二层,每次都获取第一条记录select top 1 @id=id from @temp_two_tableprint(@name_value+convert(varchar,@id))-- 将当前第二层遍历记录移除delete from @temp_two_table where id=@id-- 更新表字段if @id!=@maxid beginupdate student_table set city_value_temp=(@city_value+convert(varchar,@id)) where id=@idendend-- 将当前第一层遍历记录移除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 beginprint(@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_tablecreate 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 intwhile exists(select id from #temp_table) beginselect top 1 @id=id from #temp_tableprint(@name_value+convert(varchar,@id))-- 将当前第二层遍历记录移除delete from #temp_table where id=@id-- 更新表字段if @id!=@maxid beginupdate student_table set city_value_temp=(@city_value+convert(varchar,@id)),remark='游标加临时表处理' where id=@idendend-- 下一条记录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_nameOPEN cursor_name
FETCH NEXT FROM cursor_name INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN-- Process dataFETCH NEXT FROM cursor_name INTO @id
ENDCLOSE 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.rhkb.cn/news/280031.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

55、服务攻防——数据库安全RedisHadoopMysql未授权访问RCE

文章目录 常见服务应用的安全测试: 配置不当——未授权访问安全机制——特定安全漏洞安全机制——弱口令爆破攻击 应用服务安全测试流程: 判断服务开放情况——端口扫描&组合猜解等 端口扫描:服务开放,绑定端口没开放&#…

hot100 -- 矩阵

👂 Peter Pan - kidult. - 单曲 - 网易云音乐 👂 Bibliothque(图书馆) - Jasing Rye - 单曲 - 网易云音乐 目录 🌼前言 🌼二分模板 🎂矩阵置零 AC 标记数组 AC 标记变量 🚩…

Java使用Selenium实现自动化测试以及全功能爬虫

前言 工作中需要抓取一下某音频网站的音频,我就用了两个小时学习弄了一下,竟然弄出来,这里分享记录一下。 springboot项目 Selenium Java使用Selenium实现自动化测试以及全功能爬虫 前言1 自动化测试2 java中集成Selenium3 添加浏览器驱动4…

Word2vec 学习笔记

word2vec 学习笔记 0. 引言1. Word2vec 简介1-1. CBOW1-2. SG 2. 实战 0. 引言 最近研究向量检索,看到有同事使用 MeCab、Doc2Vec,所以把 Word2vec 这块知识学习一下。 1. Word2vec 简介 Word2vec 即 word to vector,顾名思义,…

【老话常谈之Java自学】自学Java应该怎么规划学习内容?

如果你学Java的目的是为了找到一份好工作 问这个问题之前,首先你确保自己了解了这些: IT行业都有哪些技能适合转行学习?每个技术都是做什么的?每个技术行业发展是怎样的?薪资怎么样?根据自己的情况和兴趣,选择到感兴趣的1-2个技术深入了解最终确定你就要学Java,并且有…

如何在代理的IP被封后立刻换下一个IP继续任务

目录 前言 1. IP池准备 2. 使用代理IP进行网络请求 3. 处理IP被封的情况 4. 完整代码示例 总结 前言 当进行某些网络操作时,使用代理服务器可以帮助我们隐藏真实IP地址以保护隐私,或者绕过一些限制。然而,经常遇到的问题是代理的IP可能…

Django框架的全面指南:从入门到高级【第128篇—Django框架】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django框架的全面指南:从入门到高级 Django是一个高效、功能强大的Python Web框…

JDK21虚拟线程

目录 虚拟线程 话题 什么是平台线程? 什么是虚拟线程? 为什么要使用虚拟线程? 创建和运行虚拟线程 使用线程类和线程创建虚拟线程。生成器界面 使用Executor.newVirtualThreadPerTaskExecutor()方法创建和运行…

针对BSV区块链新推出的网络访问规则NAR和警报系统AS的解释与问答

​​发表时间:2024年2月22日 BSV区块链社区团队最近开设了一个Twitter(X)话题空间,讨论BSV区块链协会最新推出的网络访问规则和警报系统的相关问题。 本次讨论由BSV区块链社区负责人Brett Banfe主持,以便社区成员更好…

刷题DAY29 | LeetCode 491-递增子序列 46-全排列 47-全排列 II

491 递增子序列(medium) 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也…

综合练习(python)

前言 有了前面的知识积累,我们这里做两个小练习,都要灵活运用前面的知识。 First 需求 根据美国/英国各自YouTube的数据,绘制出各自的评论数量的直方图 第一版 import numpy as np from matplotlib import pyplot as plt import matplo…

matlab中Signal Editor定义梯形信号输出矩形信号

matlab中Signal Editor定义梯形信号输出矩形信号,可以通过如下勾选差值数据实现梯形信号输出。

文件路径中‘/’与‘\’用法详解,与等效使用方法介绍

1、两种符号详解 在数据处理时,使用C或python语言读入数据时,涉及到文件路径的输入,文件路径在windows下,默认形式为但斜线‘\’,如下图: 若输入路径时,直接写成如下形式:“E:\codin…

JMeter 二次开发之环境准备

通过JMeter二次开发,可以充分发挥JMeter的潜力,定制化和扩展工具的能力以满足具体需求。无论是开发自定义插件、函数二次开发还是定制UI,深入学习和掌握JMeter的二次开发技术,将为接口功能测试/接口性能测试工作带来更多的便利和效…

10:00面试,10:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

Keil笔记(缘更)

Keil 一、使用Keil时可能会出现的问题1.Project框不见了2.添加文件时找不到3.交换文件位置4.main.c测试报1 warning5.搜索CtrlF 二、STLINK点灯操作1.配置寄存器进行点灯2.使用库函数进行点灯 3.GPIO1.LED闪烁4.按键控制LED 注: 一、使用Keil时可能会出现的问题 1.…

KVM 集成 OpenvSwitch 虚拟交换机

KVM 集成 OpenvSwitch 虚拟交换机 KVM(Kernel-based Virtual Machine)是Linux内核中的一种虚拟化技术,它允许在同一台主机上运行多个虚拟机。 在默认情况下,KVM使用基于Linux bridge的网络虚拟化解决方案。Linux bridge是一种内核模块,可将…

网络编程——预备知识

网络编程——预备知识 🍃套接字🌿什么是套接字🌿套接字的类型🌿套接字的位置 🍃IP🍃端口号Port🍃字节序🍃地址信息结构(结构体类型) 🍃套接字 &a…

【Python】: Django Web开发实战(详细教程)

Python Django全面介绍 Django是一个非常强大的Python Web开发框架,它以"快速开发"和"干净、实用的设计"为设计宗旨。本文将从Django的基本概念开始,逐渐引导大家理解如何使用Django构建复杂的web应用程序。 Django基本概念与原理…

浅谈前端路由原理hash和history

1、认识前端路由 本质 前端路由的本质,是监听 url 地址或 hash 值的改变,来切换渲染对应的页面组件 前端路由分为两种模式 hash 模式 history 模式 两种模式的对比 2、hash 模式 (1)hash 定义 hash 模式是一种把前端路由的路…