应用场景

我们在应用程序开发的时候,经常会遇到这样的一种情况:附属表更新了,主表的数据没有更新,这个关联表不只是外键的关联(通过附属表 ID 关联),主表中还会存在一些附属表的字段,这样一般做的目的是,在查询显示的时候减少关联(性能考虑)。凡事都有相对性,比如我们有时候会对附属表中的数据进行更新,如果没有对附属字段添加触发器,这时候就造成附属表中的数据和主表不一致,没办法,我们需要对这些“过时数据”进行手动“刷新”。

比如我们有 Product 和 Provider 表,一个商品对应一个提供商,表结构如下(只做演示):


Product 和 Provider 表之间的关系通过 ProviderID 字段进行关联,ProviderName 这个字段就是上面我们说,为了减少关联查询用的,那如果 Provider 表中的 Name 值更新了,如何更新 Product 表中的 ProviderName 值呢?

问题分析

这个数据更新的问题,其实现在看来非常简单,但是我当时在解决这个问题的时候,莫名其妙多了很多想法,对于程序员来说,两个数据集的对应数据更新,我们怎么处理呢?最简单的是遍历然后再另一个数据集中进行查找,然后对查找后的结果进行修改保存,这是一般做法,比如下面的这段伪代码:

   DataView product = new DataView();
DataView provider = new DataView();
foreach (DataRow item in provider)
{
product.RowFilter = string.Format("ProviderID={0}", item["ID"]);
//todo...
}

上面这段代码是我们一般不经过大脑写出来的,试着想一下,如果存在几十万甚至几百万的数据,这种方式程序肯定会运行到明年,不可否认,当时我想过这种方式实现的,而且还是想写个程序脚本来完成数据更新,这是多么的不靠谱啊。

如果不用程序去完成数据更新,我们就得写 SQL 脚本,数据库也不是很熟悉,只能说会简单的语法(select),连修改列的属性都忘了,幸亏在去年毕业的时候,整理了一个简单 T-SQL 系列《T-Sql学习系列完结》,现在看来,当时真是太明智了,虽然这些简单的语法网上一找一大堆,但还是觉得自己整理的看着舒服。

实现上面数据更新有很多方式,我当时还想过用游标操作,但是一想和程序中的 foreach 有什么区别的呢?还是觉得干点实事吧,最后有了下面的一段 SQL 脚本,针对上面 Product 和 Provider 表的数据更新:

   update [dbo].[Product]
set [dbo].[Product].ProviderName=[dbo].[Provider].Name
from [dbo].[Provider]
where [dbo].[Product].ProviderID=[dbo].[Provider].ID and ....

就这么简单,当时却花了很长的时间,甚至还有个疑问:不是一个数据库的表进行数据更新,可以用 SQL 实现吗?有点可笑,其实一个数据库实例下,跨数据库访问表的话,直接在表名之前加数据库名称就行了。

分享一段数据库中表数据更新SQL的更多相关文章

  1. 分享一段视频关于SQL2014 Hekaton数据库的

    分享一段视频关于SQL2014 Hekaton数据库的 Microsoft SQL Server In-Memory OLTP Project "Hekaton": App Dev ...

  2. 分享一段ios数据库代码,包括对表的创建、升级、增删查改

    分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h ...

  3. 查询数据库中表或视图或存储过程的数量 sql 语句

    如果一个数据库中表的数量较多的话,那么在统计数据库中表的数量或视图或存储过程的数量时,如果还有一个一个去数,那就太麻烦了,其实可以通过 sql 语句来查询的,sql 语句的查询方法如下: sql se ...

  4. Oracle和SQL server查询数据库中表的创建和最后修改时间

    有时候我们需要查看下数据数据库中表的创建时间和最后修改时间,可以通过以下语句实现: Oracle数据库 -- 查看当前用户下的表 SELECT * FROM USER_TABLES -- 查看数据库中 ...

  5. 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法

    在SQL数据库中使用SQL语句(格式:alter table [tablename] alter column [colname] [newDataType])修改某表的字段类型时,报一下错误:由于一 ...

  6. SQL Server数据库中表的增、删、改

    通过SqlCommand对象的ExecuteNonQuery方法执行命令行,来实现数据库中表的增.删.改.主要有5步 using System.Data.SqlClient;//载入数据库命名空间 p ...

  7. mybatis框架下解决数据库中表的列的字段名和实体类属性不相同的问题

    导包.... 实体类中的属性,getter,setter,tostring,构造等方法就不写了 private int id; private String orderNo; private floa ...

  8. mysql数据库之基础SQL语句/语法

    SQL是现在进入互联网工作人们的必须技能之一,下面分享自己觉得很nice的SQL基本语句,从网上找了,觉得很不错,就分享给大家!简要介绍基础语句: 1.说明:创建数据库  Create DATABAS ...

  9. Oracle数据库之PL/SQL过程与函数

    Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据 ...

随机推荐

  1. java 过滤表情符号

    /** * 过滤表情符号 * @create by ldw on 2016-10-25 * @param str * @return str(去掉表情符号的字符串) * @version 1.0 * ...

  2. php安装配置那些事(本文纯属个人记事与技术无关)

    上周由于项目需要,又拿起了三年没动过的php,从安装环境到配置,大体已经忘干净,于是咨询同学问度娘,终于在我的win7系统下安装了xampp的集成环境+NetBeans IDE 8.0,于是导入项目文 ...

  3. 用ProxyFactoryBean创建AOP代理

    Spring的Advisor是Pointcut和Advice的配置器,它是将Advice注入程序中Pointcut位置的代码.org.springframework.aop.support.Defau ...

  4. css3新属性object-fit,对页面img处理

    1.http://my.xueh5.com/xh5639998239/detail-3661.html 针对其进行深度讲解推荐 http://www.zhangxinxu.com/wordpress/ ...

  5. 关于[super dealloc]

    销毁一个对象时,需要重写系统的dealloc方法来释放当前类所拥有的对象,在dealloc方法中需要先释放当前类中所有的对象,然后再调用[super dealloc]释放父类中所拥有的对象.如先调用[ ...

  6. apache配置反向代理

    http.conf 去掉前面的#号 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/ ...

  7. ajax知识整理

    HTTP服务 1.服务器 服务器类型 服务类型:文件服务器.数据库服务器.邮件服务器.Web服务器等: 操作系统:Linux服务器.Windows服务器等: 应用软件:Apache服务器.Nginx ...

  8. 图解集合6:LinkedHashMap

    初识LinkedHashMap 上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见.非常有用的集合,并且在多线程情况下使用不当会有线程安全问题. 大 ...

  9. 如何给CentOS安装字体库

    很多时候,我们需要做一些图像生成工作(譬如验证码之类的),这时候,我们一般都需要用到系统的字体库.但事情却总非尽善人意,我们所使用的Linux操作系统无法像Windows操作系统那样足够“旗舰”,字体 ...

  10. 策划编写一个新的Helper类

    https://code.csdn.net/jy02305022/blqw-data 有朋友看见的话给点意见呗