分享一段数据库中表数据更新SQL

本文涉及的产品
数据可视化DataV,5个大屏 1个月
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介:

应用场景

我们在应用程序开发的时候,经常会遇到这样的一种情况:附属表更新了,主表的数据没有更新,这个关联表不只是外键的关联(通过附属表 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 实现吗?有点可笑,其实一个数据库实例下,跨数据库访问表的话,直接在表名之前加数据库名称就行了。



本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/3920134.html,如需转载请自行联系原作者

相关实践学习
Github实时数据分析与可视化
基于Github Archive公开数据集,将项目、行为等20+种事件类型数据实时采集至Hologres进行分析,并搭建可视化大屏。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
相关文章
|
6天前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
19 11
|
1天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
9 2
|
13天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
27 0
|
17天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
30 0
|
17天前
|
SQL 数据处理 数据库
|
17天前
|
SQL 存储 调度
|
17天前
|
SQL 安全 数据库
|
17天前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
35 0
|
17天前
|
SQL 存储 监控
|
17天前
|
SQL 数据库 Java
HQL vs SQL:谁将统治数据库查询的未来?揭秘Hibernate的神秘力量!
【8月更文挑战第31天】Hibernate查询语言(HQL)是一种面向对象的查询语言,它模仿了SQL的语法,但操作对象为持久化类及其属性,而非数据库表和列。HQL具有类型安全、易于维护等优点,支持面向对象的高级特性,内置大量函数,可灵活处理查询结果。下面通过示例对比HQL与SQL,展示HQL在实际应用中的优势。例如,HQL查询“从员工表中筛选年龄大于30岁的员工”只需简单地表示为 `FROM Employee e WHERE e.age > 30`,而在SQL中则需明确指定表名和列名。此外,HQL在处理关联查询时也更为直观易懂。然而,对于某些复杂的数据库操作,SQL仍有其独特优势。
26 0