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

所属分类: 数据库 / 数据库其它 阅读数: 192
收藏 0 赞 0 分享

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 子查询

更多精彩内容其他人还在看

在PostgreSQL的基础上创建一个MongoDB的副本的教程

这篇文章主要介绍了在PostgreSQL的基础上创建一个MongoDB的副本的教程,使在使用NoSQL的同时又能用到PostgreSQL中的东西,需要的朋友可以参考下
收藏 0 赞 0 分享

使用Bucardo5实现PostgreSQL的主数据库复制

这篇文章主要介绍了使用Bucardo5实现PostgreSQL的主数据库复制,作者基于AWS给出演示,需要的朋友可以参考下
收藏 0 赞 0 分享

详细讲解PostgreSQL中的全文搜索的用法

这篇文章详细介绍了的PostgreSQL中的全文搜索的用法,包括对全文搜索的一些优化的实现,需要的朋友可以参考下
收藏 0 赞 0 分享

介绍PostgreSQL中的jsonb数据类型

这篇文章主要介绍了介绍PostgreSQL中的jsonb数据类型,jsonb是PostgreSQL9.4中开始内置的类型,能够支持GIN索引,需要的朋友可以参考下
收藏 0 赞 0 分享

介绍PostgreSQL中的Lateral类型

这篇文章主要介绍了介绍PostgreSQL中的Lateral类型,Lateral是PostgreSQL9.3版本以来加入的内置类型,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql、mssql及oracle分页查询方法详解

这篇文章主要介绍了mysql、mssql及oracle分页查询方法,实例分析了数据库分页的实现技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

telnet连接操作memcache服务器详解

这篇文章主要介绍了telnet连接操作memcache服务器详解,本文讲解了连接、添加修改、读取、删除、清空所有缓存等操作命令,需要的朋友可以参考下
收藏 0 赞 0 分享

SQL语句实现删除重复记录并只保留一条

这篇文章主要介绍了SQL语句实现删除重复记录并只保留一条,本文直接给出实现代码,并给出多种查询重复记录的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

50条SQL查询技巧、查询语句示例

这篇文章主要介绍了50条SQL查询技巧、查询语句示例,本文以学生表、课程表、成绩表、教师表为例,讲解不同需求下的SQL语句写法,需要的朋友可以参考下
收藏 0 赞 0 分享

SQL查询出表、存储过程、触发器的创建时间和最后修改时间示例

这篇文章主要介绍了SQL查询出表、存储过程、触发器的创建时间和最后修改时间示例,本文直接给出代码实例,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多