两道SQL数据库应用 自考简答题 求高手帮忙

默认分类 未结 1 992
___泥_鳅___
___泥_鳅___ 2023-03-18 17:45
相关标签:
1条回答
  • 2023-03-18 18:11

    慢慢的,对一些稍微复杂一点的SQL ,往往就会想到用游标去处理。也正是因为大量使用,渐渐的,在使用的过程中,也真正体会到了游标的低效,一条一条的处理方式,在数据量很小的情况下还可以,当数据一旦很多,而处理过程又非常复杂时,往往速度就会很慢。

    于是乎,慢慢的开始放弃使用游标,最后都快忘记了这个老朋友了。

    今天,在论坛突然发现有人提了一个问题,希望用游标来解决,于是乎,又让我再次想起了游标。

    下面是那个网友提出的问题:

    我有两张表,分别是:table1KHMC SPDM DJ SL XSSL广西骆俊峰 5609B 100.000012 NULL广西骆俊峰 5609B 80.0000 7 NULL广西骆俊峰 5609B 60.0000 6 NULL广西骆俊峰 5609B 50.0000 13 NULL广西骆俊峰 5609B 40.0000 21 NULLtable2khmc spdm sl bysl广西骆俊峰 5609B 20 NULL而我想要的结果是用第二张表里的数据去一行行的填充第一个表的数据(关联关系是khmc,spdm):KHMC SPDM DJ SL XSSL广西骆俊峰 5609B 100.000012 12广西骆俊峰 5609B 80.0000 7 7广西骆俊峰 5609B 60.0000 6 1广西骆俊峰 5609B 50.0000 13 NULL广西骆俊峰 5609B 40.0000 21 NULL

    首先是建表语句:

    create table table1(KHMC varchar(20), SPDM varchar(10), DJ varchar(10), SL int, XSSL int) insert into table1 select ‘广西骆俊峰‘, ‘5609B‘, ‘100.0000‘, 12, null union all select ‘广西骆俊峰‘, ‘5609B‘, ‘80.0000‘, 7, null union all select ‘广西骆俊峰‘, ‘5609B‘, ‘60.0000‘, 6, null union all select ‘广西骆俊峰‘, ‘5609B‘, ‘50.0000‘, 13, null union all select ‘广西骆俊峰‘, ‘5609B‘, ‘40.0000‘, 21, null create table table2(khmc varchar(20), spdm varchar(10), sl int, bysl int) insert into table2 select ‘广西骆俊峰‘, ‘5609B‘, 20, null然后是游标代码,是嵌套的游标,外层游标内还有一个游标:

    declare @table1_khmc varchar(10)declare @table1_spdm varchar(20)declare @table1_sl intdeclare @table1_xssl int --定义table1的游标declare cur_table1 cursorfor select KHMC,SPDM,sl,xssl from table1 for update --可以游标更新的 declare @table2_khmc varchar(10)declare @table2_spdm varchar(20)declare @table2_sl int --定义table2的游标declare cur_table2 cursorfor select khmc,spdm,sl from table2 --用于查询的游标 open cur_table2; --打开游标 --从游标中取数,放到变量中fetch next from cur_table2 into @table2_khmc,@table2_spdm,@table2_sl while @@FETCH_STATUS = 0 --外层游标cur_table2的遍历begin open cur_table1; fetch next from cur_table1 into @table1_khmc,@table1_spdm,@table1_sl,@table1_xssl while @@FETCH_STATUS = 0 --内存游标cur_table1的遍历 begin if (@table1_khmc = @table2_khmc) and (@table2_spdm = @table1_spdm) beginupdate table1set xssl = case when @table2_sl >= isnull(@table1_sl,0) then @table1_sl when @table2_sl < isnull(@table1_sl,0) then @table2_sl endwhere current of cur_table1;--如果table2的sl大于table1的sl,那么可以继续循环,否则就退出内层有游标if @table2_sl >= isnull(@table1_sl,0) set @table2_sl = @table2_sl - ISNULL(@table1_sl,0);else break; fetch next from cur_table1 into @table1_khmc,@table1_spdm,@table1_sl,@table1_xssl end end close cur_table1; --关闭内层游标 fetch next from cur_table2 into @table2_khmc,@table2_spdm,@table2_sl end close cur_table2; --关闭游标 deallocate cur_table2; --释放游标cur_table2的资源 deallocate cur_table1; --释放游标cur_table1的资源 --查询更新后的结果select *from table1/*KHMC SPDMDJ SLXSSL广西骆俊峰5609B100.0000 1212广西骆俊峰5609B80.0000 7 7广西骆俊峰5609B60.0000 6 1广西骆俊峰5609B50.0000 13NULL广西骆俊峰5609B40.0000 21NULL*/

    点赞 1 收藏 分享 文章举报 不想长大啊 发布了416 篇原创文章 · 获赞 135 · 访问量 94万+ 他的留言板 关注

    【Transact-SQL】让人快遗忘的游标

    标签:locatetitleorgavatarstaticnaldetailspop登录

    一、游标的种类和用途1、种类:Transact_SQL 游标,API 服务器游标和客户游标 等三种。2、用途:(1) Transact_SQL 游标 Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。(2) API 游标API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。(3) 客户游标客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。二、数据库中架构的作用对于最新的关系数据库系统,数据库架构是一个独立于数据库用户的非重复命名空间。可以将架构视为对象的容器,可以在数据库中创建和更改架构,并且可以授予用户访问架构的权限。任何用户都可以拥有架构,并且架构所有权可以转移。补充 说明如下:1.一个架构中不能包含相同名称的对象,相同名称的对象可以在不同的架构中存在。2.一个架构只能有一个所有者,所有者可以是用户, 数据库角***, 应用程序角***。3.一个用数据库角***可以可以拥有一个默认架构,和多个架构。4.多个数据库用户可以共享单个默认架构。5.由于架构与用户独立,删除用户不会删除架构中的对象。

    1.三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标。 用途:是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。2.存放数据库对象的一个容器,里面的每一个元素名称都是唯一的。

    0 讨论(0)
提交回复