利用带关联子查询Update语句更新数据的方法

Update是T-sql中再简单不过的语句了,update table set column=expression [where condition],我们都会用到。但update的用法不仅于此,真正在开发的时候,灵活恰当地使用update可以达到事半功倍的效果。

假定有表Table1(a,b,c)和Table2(a,c),现在Table1中有些记录字段c为null,要根据字段a在Table2中查找,取出字段a相等的字段c的值来更新Table1。一种常规的思路,通过游标遍历Table1中字段c为null的所有记录,在循环体内查找Table2并进行更新,即用游标Cursor的形式。测试sql语句如下:

--1.创建测试表
  create TABLE Table1
  (
    a varchar(10),
    b varchar(10),
    c varchar(10),
    CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
    (
      a ASC
    )
  ) ON [PRIMARY]

  create TABLE Table2
  (
    a varchar(10),
    c varchar(10),
    CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
    (
      a ASC
    )
  ) ON [PRIMARY]
  GO
  --2.创建测试数据
  Insert into Table1 values('赵','asds',null)
  Insert into Table1 values('钱','asds','100')
  Insert into Table1 values('孙','asds','80')
  Insert into Table1 values('李','asds',null)

  Insert into Table2 values('赵','90')
  Insert into Table2 values('钱','100')
  Insert into Table2 values('孙','80')
  Insert into Table2 values('李','95')
  GO
  select * from Table1

  --3.通过游标方式更新
  declare @name varchar(10)
  declare @score varchar(10)
  declare mycursor cursor for select a from Table1 where c is null
  open mycursor
  fetch next from mycursor into @name
  while(@@fetch_status = 0)
  BEGIN
    select @score=c from Table2 where a=@name
    update Table1 set c = @score where a = @name
    fetch next from mycursor into @name
  END
  close mycursor
  deallocate mycursor
  GO
  --4.显示更新后的结果
  select * from Table1
  GO
  --5.删除测试表
  drop TABLE Table1
  drop TABLE Table2

虽然用游标可以实现,但代码看起来很复杂,其实用Update根据子关联来更新只要一条语句就可以搞定了,测试代码如下:

--1.创建测试表
  create TABLE Table1
  (
    a varchar(10),
    b varchar(10),
    c varchar(10),
    CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
    (
      a ASC
    )
  ) ON [PRIMARY]

  create TABLE Table2
  (
    a varchar(10),
    c varchar(10),
    CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
    (
      a ASC
    )
  ) ON [PRIMARY]
  GO
  --2.创建测试数据
  Insert into Table1 values('赵','asds',null)
  Insert into Table1 values('钱','asds','100')
  Insert into Table1 values('孙','asds','80')
  Insert into Table1 values('李','asds',null)

  Insert into Table2 values('赵','90')
  Insert into Table2 values('钱','100')
  Insert into Table2 values('孙','80')
  Insert into Table2 values('李','95')
  GO
  select * from Table1

  --3.通过Update方式更新
  Update Table1 set c = (select c from Table2 where a = Table1.a) where c is null
  GO

  --4.显示更新后的结果
  select * from Table1
  GO
  --5.删除测试表
  drop TABLE Table1
  drop TABLE Table2

参考资料:也许是被忽略的update语句,update 子查询

(0)

相关推荐

  • 利用带关联子查询Update语句更新数据的方法

    Update是T-sql中再简单不过的语句了,update table set column=expression [where condition],我们都会用到.但update的用法不仅于此,真正在开发的时候,灵活恰当地使用update可以达到事半功倍的效果. 假定有表Table1(a,b,c)和Table2(a,c),现在Table1中有些记录字段c为null,要根据字段a在Table2中查找,取出字段a相等的字段c的值来更新Table1.一种常规的思路,通过游标遍历Table1中字段c为

  • mysql关联子查询的一种优化方法分析

    本文实例讲述了mysql关联子查询的一种优化方法.分享给大家供大家参考,具体如下: 很多时候,在mysql上实现的子查询的性能较差,这听起来实在有点难过.特别有时候,用到IN()子查询语句时,对于上了某种数量级的表来说,耗时多的难以估计.本人mysql知识所涉不深,只能慢慢摸透个中玄机了. 假设有这样的一个exists查询语句: select * from table1 where exists (select * from table2 where id>=30000 and table1.u

  • MySQL中表子查询与关联子查询的基础学习教程

    MySQL 表子查询 表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据. MySQL 表子查询实例 下面是用于例子的两张原始数据表: article 表: blog 表: SQL 如下: SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog) 查询返回结果如下所示: 该 SQL 的意义在于查找 article 表中指定的字段同时也存在于 blog 表中的所有的行(注

  • Thinkphp批量更新数据的方法汇总

    以下小编给大家列出了三种实现thinkphp批量更新数据的方法,写的不好还请见谅,有意见欢迎提出,共同学习进步! 方法一: //批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式 function batch_update($table_name='',$data=array(),$field=''){ if(!$table_name||!$data||!$field){ return false; }else{ $sql='UPDATE '.$table_name

  • django框架使用orm实现批量更新数据的方法

    本文实例讲述了django框架使用orm实现批量更新数据的方法.分享给大家供大家参考,具体如下: 好久没有用django来改版博客了,突然感觉到生疏了.没办法,业余玩python,django,工作用java的原因,也只能如此.在用django写一个类别更新的时候同时更新子类的parentcode, 如果是自己写原生的sql的话,很好解决.但既然用 django 就用 django 的 orm 去实现: 最简单的方法: MyModel.objects.filter(parentcode=ori_

  • angular+ionic 的app上拉加载更新数据实现方法

    第一步,首先需要在<ion-content>标签里面加入标签<ion-infinite-scroll ng-if="hasmore" on-infinite="loadMore()" distance="5%"></ion-infinite-scroll> 里面的属性解释, ng-if  值 布尔型,如果为true,则可以触发上拉事件 on-infinite 上拉时触发的事件 distance 列表底部滚动到可

  • php+mysqli批量查询多张表数据的方法

    本文实例讲述了php+mysqli批量查询多张表数据的方法.分享给大家供大家参考.具体实现方法如下: 注意这里使用到了两个新的函数multi_query与store_result,具体代码如下: 复制代码 代码如下: <?php //1.创建数据库连接对象 $mysqli = new MySQLi("localhost","root","123456","liuyan"); if($mysqli->connect_

  • JS获取子窗口中返回的数据实现方法

    在开发的时候,遇到了这样一个问题,客户填写自己的收货地址,可以新建,但同时也可以选择之前填写的,由于我们的客户本身就是商户,地址繁多,把它之前的地址简单用个下拉框罗列出来显然不合适,并且客户要求能够对地址通过姓名筛选,这样,选择地址就必须再开一个小窗来完成了,那么,小窗中填写的值怎么回传呢? js有个方法showModalDialog在这种情况下用的就比较多了,其作用是打开一个模态窗口,什么事模态窗口?就是打开后不能操作父窗口,只有子窗口操作完了,关闭了,才可以继续父窗口的动作.回到最开始的问题

  • SQL Server实现显示每个类别最新更新数据的方法

    本文实例讲述了SQL Server实现显示每个类别最新更新数据的方法.分享给大家供大家参考,具体如下: 在项目中经常遇到求每个类别最新显示的数据,比如显示某某某类别最新更新的5条数据.特写下这个sql记录于此: -- ============================================= -- 作者: <Rising_Sun> -- 创建日期: <2012-9-28> -- 描述: <显示每个类别下最新更新的n条数据> -- ============

  • 使用 TOP 子句限制UPDATE 语句更新的数据

    可以使用 TOP 子句来限制 UPDATE 语句中修改的行数.当 TOP (n) 子句与 UPDATE 一起使用时,将针对随机选择的 n 行执行删除操作.例如,假设您要为一位高级销售人员减轻销售负担,而将一些客户分配给了一位初级销售人员.下列示例将随机抽样的 10 个客户从一位销售人员分配给了另一位. USE AdventureWorks2008R2; UPDATE TOP (10) Sales.Store SET SalesPersonID = 276 WHERE SalesPersonID

随机推荐