查询结果集直接更新到同一张表中的某个字段
来源:互联网 发布:碘酊不脱碘会怎样 知乎 编辑:程序博客网 时间:2024/04/28 08:44
在使用数据库查询时候,通常需要将查询得到的结果集更新回到原来的表中,除了写函数的方法外,可以使用通用表达式CTE(common table) 来解决.实例如下:先需要对如下表按照score 排名,然后将排名写会排名字段中。
CREATE TABLE table1 ( Id INT, Title VARCHAR(2), score float, 排名 int);WITH CTE AS(SELECT id, RANK() OVER(ORDER BY score) AS 排名 FROM table1) --with 前一个语句必须有分号,为了保险可以直接在其前面加一个分号UPDATE t2 SET 总名次 = 排名 FROM CTE t1 INNER JOIN table1 t2 ON t1.id = t2.id
毕设代码:
USE [GD_SMAS]GO/****** Object: StoredProcedure [dbo].[Exam_Calc] Script Date: 2015/1/7 15:00:49 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo].[Exam_Calc]@eid UNIQUEIDENTIFIER,@jiedu BIT,@fudu BIT,@onlySort BIT,@result NVARCHAR(255) OUTPUTASBEGINDECLARE @tableName VARCHAR(50)SELECT @tableName=tableName FROM dbo.tExams WHERE id= @eid IF @onlySort = 0 --先计算成绩,然后排名BEGINDECLARE @test VARCHAR(1000) DECLARE @vCourseStr VARCHAR(1000) --汇总信息字符串SELECT @vCourseStr=vCourses FROM dbo.tExams WHERE id=@eidIF LEN(LTRIM(RTRIM(@vCourseStr)))>0--存在汇总科目(再次验证)BEGINDECLARE @vIndex INT --逗号下标DECLARE @oldVindex INT --前一个逗号下标DECLARE @dhIndex INT --等号下标,其前面的为科目,后面为会总项DECLARE @courseName VARCHAR(20) --科目名称DECLARE @struct VARCHAR(100) --成绩构成项DECLARE @updateSql VARCHAR(1000)DECLARE @zongfen VARCHAR(1000) = ''SET @oldVindex = 0SET @vIndex = CHARINDEX(',',@vCourseStr); --获取第一个逗号下标,如果没有逗号则直接跳过while循环 --SELECT @vIndex AS '第一个逗号下标'DECLARE @oneCourseStr VARCHAR(1000) --一门课程的汇总信息WHILE @vIndex>0 --但是此时最后一个获取的@vIndex=0需要在while后面再处理BEGINSET @oneCourseStr =RIGHT(LEFT(@vCourseStr,@vIndex-1),@vIndex-@oldVindex-1)SET @dhIndex = CHARINDEX('=', @oneCourseStr)SET @courseName = LEFT(@oneCourseStr,@dhIndex-1)SET @struct = RIGHT(@oneCourseStr,LEN(@oneCourseStr)-@dhIndex)SET @zongfen =@courseName+'+'+ @zongfenSET @updateSql = 'UPDATE Exam.dbo.'+ @tableName+' SET '+ @courseName+'='+ @struct+' WHERE id IN (SELECT id FROM Exam.dbo.'+ @tableName+')'EXEC(@updateSql) SET @oldVindex = @vIndexSET @vIndex = CHARINDEX(',',@vCourseStr,@vIndex+1); --获取下一个逗号下标 END--while退出后处理最后一个,如果是只有一个科目,则while循环体不执行,直接执行下面代码DECLARE @lastVindex INT = @oldVindexSET @oneCourseStr = RIGHT(@vCourseStr,LEN(@vCourseStr)-@lastVindex) --获取最后一门课程SET @dhIndex = CHARINDEX('=',@oneCourseStr)SET @courseName = LEFT(@oneCourseStr,@dhIndex-1)SET @zongfen = @zongfen+@courseNameSET @struct = RIGHT(@oneCourseStr,LEN(@oneCourseStr)-@dhIndex)SET @updateSql = 'UPDATE Exam.dbo.'+ @tableName+' SET '+ @courseName+'='+ @struct+' WHERE id IN (SELECT id FROM Exam.dbo.'+ @tableName+')'EXEC(@updateSql)--最后计算总分SET @updateSql = 'UPDATE Exam.dbo.'+ @tableName+' SET 总分='+ @zongfen+' WHERE id IN (SELECT id FROM Exam.dbo.'+ @tableName+')'EXEC(@updateSql)ENDEND --如果需要计算成绩,则先执行上面的代码然后执行下面的进行排序,否则,直接执行下面排序代码DECLARE @condition VARCHAR(100) =' WHERE 生源类型=''应届'''IF @jiedu = 0 AND @fudu = 1BEGINSET @condition=' WHERE 生源类型=''应届'''+' OR 生源类型=''复读'''ENDELSE IF @jiedu = 1 AND @fudu = 0 SET @condition=' WHERE 生源类型=''应届'''+' OR 生源类型=''借读'''ELSE IF @jiedu =1 AND @fudu = 1SET @condition=''ELSESET @condition = @condition DECLARE @rankSql VARCHAR(1000)SET @rankSql ='SELECT RANK() OVER(ORDER BY 总分) AS 排名, 总分,* FROM Exam.dbo.test '+@condition;SET @rankSql =';WITH CTE AS(SELECT id, RANK() OVER(ORDER BY 总分) AS 排名 FROM Exam.dbo.test) UPDATE t2 SET 总名次 = 排名 FROM CTE t1 INNER JOIN Exam.dbo.'+ @tableName+' t2 ON t1.id = t2.id'EXEC(@rankSql)SET @result = 'succeed' END
0 0
- 查询结果集直接更新到同一张表中的某个字段
- mysql同一张表的字段更新到另一张表的字段
- 多个表连接时的某一字段值更新到对应的另一张表中的某个字段中
- Oracle 更新一张表中某个字段等于另一张表中的某个字段
- 将一个表中的某个字段根据id关联写入到另一张表中的某个字段中去
- 如何更新同一张表的两个以上的字段
- 同一张表两次查询结果集合并
- 更新查询的结果集中的某个字段
- 一个表的查询结果直接插入到另一张表
- 查询同一张表和更新同一张表的时候
- 往同一张表中的不同字段分别添加图片路径(既多张图路径上传到不同的字段上)
- 将同一张表的某列字段值全部添加到另一列字段中的sql语句
- mysql对同一张表进行查询和赋值更新
- MySQL数据库同时查询更新同一张表
- 把一个表某个字段内容复制到另一张表的某个字段。MYSQL
- mysql把一个表某个字段内容复制到另一张表的某个字段。
- oracle 直接更新查询结果
- SQL从一张表的某个字段更新为另一张表的字段
- 数据库记录
- Linux软链接和硬链接
- NGINX 图片服务器
- 如何对双卡手机的通话记录的数据添加
- OpenGL红宝书学习笔记(1)
- 查询结果集直接更新到同一张表中的某个字段
- jvm serializer 功能&性能基准测试
- .net mvc使用jquery ajax
- ERLANG 进程字典
- 将博客搬至CSDN
- Android延时执行的几种方法
- hive权限介绍
- spring mvc 静态资源配置 注意web.xml中DispatcherServlet配置
- javascript 返回数组中不重复的元素