将列更新从一个表传递到另一个表

 更新时间:2016年11月25日 16:40  点击:1610
问:怎样在一个UPDATE语句中使用表B的三个列更新表A中的三个列?
答:对这个问题,您可以使用强大的关系代数。本页中的代码说明了如何组合使用FROM子句和JOIN操作,以达到用其他表中数据更新指定列的目的。在设计关系表达式时,您需要决定是否需要单一行匹配多个行(一对多关系),或者需要多个行匹配被联接表中的单一行以更新所有行(多对一关系)。
在一对多关系中,SQL Server始终使用它找到的最后一行更新数据。但是,您无法控制最后一行所在的位置。在多处理器的计算机上,查询可能是同步进行的,相同的查询最后一行的位置可能会不同。因此,Microsoft建议尽量不要使用一对多关系。
如果待更新的表与FROM子句中的表相同,并且FROM子句只包含对该表的一个引用,别名可能未被指定。如果待更新的表在FROM子句中出现了多次,只有该表的一个引用可以省略表的别名,对该表的所有其他引用必须包含一个表别名。
USE tempdb
GO
CREATE TABLE #t1 (c1 int NOT NULL, c2 char(5), c3 char(5),
c4 char(5))
GO
CREATE TABLE #t2 (c1 int NOT NULL, c2 char(5), c3 char(5),
c4 char(5))
GO
--数据赋值
INSERT #t1 values (1,'hello','there','fred')
INSERT #t2 values (1,'how','are','you?')
--更新数据
UPDATE #t1 SET #t1.c2 = #t2.c2, #t1.c3 = #t2.c3,
#t1.c4 = #t2.c4
FROM #t2
WHERE #t1.c1 = #t2.c1
--检查结果
SELECT * FROM #t1
—Microsoft SQL Server开发团队


问:在我们的开发环境下,每个人都有系统管理员(sa)密码,5个组使用一个数据库。在某个开发人员不小心删除了数据后,我没有办法确定谁删除哪一块数据。当开发人员更新数据库中的数据时,如何审核工作站或登录ID?
答:因为您工作于开发环境下,使用SQL事件探查器和服务器跟踪所带来的性能损失并不会影响生产环境,所以您可以设置一个服务器跟踪,在后台将信息记录在一个表中。然后,您可以搜索该表以确定谁删除了数据。
显然,一次为多个用户分配sa账户会带来许多问题。以下是您应该采取的一些措施:
为每个开发团队创建该数据库的一份拷贝,为每个团队提供一个仅数据库拥有者才有访问权的账户。这样的话,他们就不会互相影响了。
 
如果每个开发人员都需要sa访问权(例如运行SQL事件探查器跟踪),并且您运行的是SQL Server 2000 Enterprise或Developer Edition,您可以为每个团队提供SQL Server的一个实例及其专用的sa密码。
 
考虑为每个项目设置一个开发环境,并以一个集成环境的方式由一个版本数据库管理员对所有项目间冲突进行管理。这样的话,因为架构改变脚本在进入集成环境之前已经经过了测试,生产版本的质量将有所改善。
 
—The Microsoft SQL Server开发团队


:本地的一个ISP托管了我们的SQL Server,但是我不能看到或连接到运行在该计算机上的命名实例。我知道SQL Server 2000命名实例不使用TCP/IP 1433端口,并且确定该SQL Server实例所使用的TCP/IP端口是打开的。您有什么建议吗?
:许多人知道如何使用SQL Server网络实用工具或SQL Server错误日志来确定SQL Server实例的监听端口。但许多人似乎忘记或者根本不知道——UDP 1434端口也必须是打开的,以确保您能够正确地访问和浏览命名实例。我建议您仔细研究一下这一要求。在SQL Server在线书籍中搜索“1434”,您将得到三个颇有研究价值的搜索结果。在SQL Server杂志网站2001年7月刊我的SQL Server实用技巧专栏中,您还可以查找到有关访问命名实例的信息(InstantDoc ID 21127)。在此我也简单解释一下。SQL Server在UDP 1434端口上建立一个监听服务,让客户端从服务器上查询到命名实例及其网络配置信息的一个列表。该监听服务始终运行在UDP 1434端口上,并且用户无法更改该运行端口。
—Brian Moran


问:怎样才能将XML文件导入SQL Server 2000?
答:将XML文件导入SQL Server有若干种方法,这里提供其中的3种:
大容量装载COM接口。如果需要将文档的实体和属性析取到关系表中,最快的方法就是使用SQL Server 2000 Extensible Markup Language 3.0 Service Pack 1(SQLXML 3.0 SP1)提供的大容量装载COM接口。大容量状态COM接口包含在SQLXML 3.0 SP1的免费下载中。
textcopy.exe命令行实用工具。如果不希望将文档的实体和属性析取到关系表中,您可以使用textcopy.exe命令行实用工具。Textcopy.exe是将文本和image数据类型从单一服务器行或列移入或移出的优秀工具。
数据转换服务(DTS)。如果XML文档很简单,您可以使用DTS将信息逐行析取到表中。这一方法要求您将XML文件定义为输入数据源,将数据库表定义为输出数据源,并编写ActiveX脚本剖析"<"和">"方式的字符输入,以析取实体、属性及其值。
 
—Microsoft SQL Server开发团队


问:我的一个表中包含了名为IdValue的单列主键。对于给定的IdValue值,我希望找到紧邻目标值之前和之后的表行(假定结果按IdValue排序)。怎样才能不使用游标而通过一个基于集合的方法得到需要的结果?
答:Transact-SQL是一个基于集合的语言,使用它在结果集中定位特定的行并非一件易事。但是,服务器端ANSI Transact-SQL游标的性能远远不如基于集合的解决方案,因此,学习解决问题的多种技术非常重要,尤其在面临上述问题时。
以Northwind数据库中的Orders表为例。我们可以这样重述该问题:怎样才能在Orders表中找到紧邻特定行之前和之后的行而不使用游标?假设我们按照OrderId列对结果集排序。
创造性地使用SQL Server的MIN()、MAX()和 TOP功能可以帮助您解决诸如此类的结果集定位问题。程序清单1和2给出了两个相似的、仅有细微差别的解决方法。程序清单1提供了一个常见的解决方案,因为它运用了@TargetOrder的MIN()和MAX()终点。但在某些情况下,展示TOP的灵活性也很有用。请注意,在以参数方式提供Orders表的最小OrderId(10248)时,程序清单2中的查询将返回空集,因为该查询假定在@TargetOrder行前总有一个行存在。
一般说来,生成结果集的方法不止一种,其中某一方法通常比其他的更高效。当您对这两个例子评估SHOWPLAN和SET STATISTICS IO信息时,您会发现运用了TOP语句的程序清单2的效率略微高于程序清单1。差别很细微的原因在于样本数据集很小,但在存在多种查询方法的情况下,测试不同方法的性能非常重要。
—Brian Moran
程序清单1:使用包含OR关键字的MIN() and MAX()函数查找目标行
DECLARE @TargetOrder int
SET @TargetOrder=10330
FROM Orders
WHERE OrderId=@TargetOrder
OR OrderId=(SELECT MAX(OrderId)
FROM orders WHERE OrderId < @TargetOrder)
OR OrderId = (SELECT MIN(OrderId)
FROM orders WHERE OrderId > @TargetOrder)
程序清单2:使用TOP关键字查找目标行
SELECT
TOP 3
*
FROM orders
WHERE OrderId >=(SELECT MAX(OrderId) FROM orders
WHERE OrderId < @TargetOrder)
ORDER BY
OrderId


[!--infotagslink--]

相关文章

  • postgresql 实现多表关联删除

    这篇文章主要介绍了postgresql 实现多表关联删除操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-02
  • mysql的3种分表方案

    一、先说一下为什么要分表:当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。根据个人经验,mysql执行一个sql的过程如下:1...2014-05-31
  • js实现列表按字母排序

    这篇文章主要为大家详细介绍了js实现列表按字母排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-11
  • javaScript年份下拉列表框内容为当前年份及前后50年

    javascript下拉列表框,内容为当前年份及前后50年,默认选择为当前年份 复制代码 代码如下: <script language="javascript" type="text/javascript"> window.onload=function(){ //设置年份的选择 var myDate= new Date(...2014-05-31
  • Element图表初始大小及窗口自适应实现

    这篇文章主要介绍了Element图表初始大小及窗口自适应实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-10
  • 基于postgresql数据库锁表问题的解决

    这篇文章主要介绍了基于postgresql数据库锁表问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-30
  • Python 列表(List)的底层实现原理分析

    这篇文章主要介绍了Python 列表(List)的底层实现原理分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • PostgreSQL之分区表(partitioning)

    通过合理的设计,可以将选择一定的规则,将大表切分多个不重不漏的子表,这就是传说中的partitioning。比如,我们可以按时间切分,每天一张子表,比如我们可以按照某其他字段分割,总之了就是化整为零,提高查询的效能...2020-07-11
  • C#实现绘制面形图表的方法详解

    这篇文章主要介绍了C#实现绘制面形图表的方法,对于C#初学者很好的掌握C#图形绘制有一定的借鉴价值,需要的朋友可以参考下...2020-06-25
  • 基于c#实现的九九乘法表(简单实例)

    本文主要分享了基于c#实现的九九乘法表,代码简洁,需要的朋友可以参考下,希望对大家有所帮助...2020-06-25
  • easyUI下拉列表点击事件使用方法

    这篇文章主要为大家详细介绍了easyUI下拉列表点击事件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-05-22
  • vbs 读写注册表之系统启动项添加与删除

    这篇文章主要介绍了vbs 读写注册表之系统启动项添加值,需要的朋友可以参考下...2020-06-30
  • JavaScript实现网页下拉列表的省市联动

    这篇文章主要为大家详细介绍了JavaScript实现网页下拉列表的省市联动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-07
  • 如何使用RoughViz可视化Vue.js中的草绘图表

    这篇文章主要介绍了如何使用RoughViz可视化Vue.js中的草绘图表,帮助大家更好的理解和使用roughViz,感兴趣的朋友可以了解下...2021-01-31
  • C#中的多线程多参数传递详解

    第一种解决方案的原理是:将线程执行的方法和参数都封装到一个类里面。通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递多个参数...2020-06-25
  • C#设置自定义文件图标实现双击启动(修改注册表)

    这篇文章介绍的是利用C#设置自定义文件图标,然后实现双击启动的功能,文章给出了示例代码,介绍的很详细,有需要的可以参考借鉴。...2020-06-25
  • Echarts实例教程之树形图表的实现方法

    众所周知echarts是一个纯JavaScript的图标库,下面这篇文章主要给大家介绍了关于Echarts实例之树形图表的实现方法,需要的朋友可以参考下...2021-08-06
  • C#实现窗体间传递数据实例

    这篇文章主要介绍了C#实现窗体间传递数据实例,需要的朋友可以参考下...2020-06-25
  • DTO 实现 service 和 controller 之间值传递的操作

    这篇文章主要介绍了DTO 实现 service 和 controller 之间值传递的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • C#操作windows注册表的方法

    这篇文章主要介绍了C#操作windows注册表的方法,涉及C#针对注册表的读取与写入技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25