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

 更新时间:2014年08月17日 11:06:35   投稿:mdxy-dxy  
这篇文章主要介绍了利用带关联子查询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 子查询

相关文章

  • 恢复 SQL 被注入后的数据代码

    恢复 SQL 被注入后的数据代码

    当数据库别批量注入挂马后,需要批量替换掉,可以参考下面的代码。
    2009-02-02
  • postgresql sql批量更新记录

    postgresql sql批量更新记录

    向postgresql中利用sql批量跟新记录的实现代码。
    2009-07-07
  • 数据库librarydb多表查询的操作方法

    数据库librarydb多表查询的操作方法

    这篇文章主要介绍了数据库librarydb多表查询的操作方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • 关于SQL中PIVOT函数的使用方法详解

    关于SQL中PIVOT函数的使用方法详解

    SQL Server中的PIVOT函数是一种用于将行数据转换为列数据的表格旋转函数,这篇文章主要给大家介绍了关于SQL中PIVOT函数的使用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Navicat premium连接数据库出现:2003 Can''t connect to MySQL server on''localhost''(10061)

    Navicat premium连接数据库出现:2003 Can''t connect to MySQL server o

    这篇文章主要介绍了Navicat premium连接数据库出现:2003 - Can't connect to MySQL server on 'localhost' (10061 "Unknown error")的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 微信使用 SQLite 保存聊天记录的原因分析

    微信使用 SQLite 保存聊天记录的原因分析

    SQLite的SQL方言也非常强大,它比MySQL早四年就开始支持with语句,本文将介绍SQLite在2018年新增加的SQL功能,也就是SQLite从版本3.22.0到3.26.0所新增加的SQL功能,感兴趣的朋友一起看看吧
    2023-07-07
  • clickhouse数据库删除数据的五种方式

    clickhouse数据库删除数据的五种方式

    clickhouse数据库清理数据的方式很多,每种方式都各有自己的优缺点,请根据实际需要采用适合自己的方式,本文将逐一给大家介绍,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • 一条慢SQL导致购物车服务无法使用的解决方案

    一条慢SQL导致购物车服务无法使用的解决方案

    今天小编就为大家分享一篇关于一条慢SQL导致购物车服务无法使用的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • MySQL与Oracle 差异比较之一数据类型

    MySQL与Oracle 差异比较之一数据类型

    这篇文章主要介绍了MySQL与Oracle 差异比较之一数据类型,需要的朋友可以参考下
    2017-04-04
  • SQLite快速入门指南

    SQLite快速入门指南

    这篇文章主要介绍了SQLite快速入门指南,作为开源的嵌入式数据库,SQLite可以在不需要过多投入数据库开发时提供十分轻便的服务,需要的朋友可以参考下
    2015-07-07

最新评论