工作中遇到的  update 的更新方法

以前update 表 set 列 = 新值 

   稍稍进阶    update 表 set 列 = (select  值 from 表 where ...) where ....

 分析 这种效率低 , 笛卡尔积设定  消耗io 比较大

now   使用显示关联的方法

                       update 表a  set a.字段1 =b.字段1  ,

                        a.字段2 =b.字段2   

                      from  表a  a  inner join 表b b  with(nolock) on  a.相关字段=b.相关字段

                      where  isnull(a.字段1,'')<> ''  or  a.字段2 is not null 

  解释 这种先进行内关联的,在修改可以减少io操作

关于update set from where  

下面是这样一个例子:

两个表a、b,想使b中的memo字段值等于a表中对应id的name值   
  表a:id,name   
            1       王   
            2       李   
            3       张   
  表b:id,ClientName   
            1         
            2   
            3   
(MS SQL Server)语句:update   b  set   ClientName   =   a.name   from   a,b   where   a.id   =   b.id  

(Oralce)语句:update   b  set   (ClientName)   =  (SELECT name FROM a WHERE b.id = a.id)

(Mysql)语句:: UPDATE A, B SET A1 = B1, A2 = B2, A3 = B3 WHERE A.ID = B.ID

update set from 语句格式

当where和set都需要关联一个表进行查询时,整个 update执行时,就需要对被关联的表进行两次扫描,显然效率比较低。
对于这种情况,Sybase和SQL SERVER的解决办法是使用UPDATE...SET...FROM...WHERE...的语法,实际上就是从源表获取更新数据。

在 SQL 中,表连接(left join、right join、inner join 等)常常用于 select 语句,其实在 SQL 语法中,这些连接也是可以用于update 和 delete 语句的,在这些语句中使用 join 还常常得到事半功倍的效果。

Update T_OrderForm SET T_OrderForm.SellerID =B.L_TUserID
FROM T_OrderForm A LEFT JOIN T_ProductInfo   B ON B.L_ID=A.ProductID

用来同步两个表的数据!

Oralce和DB2都支持的语法:

UPDATE A  SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)

MS SQL Server不支持这样的语法,相对应的写法为:
UPDATE A  SET A1 = B1, A2 = B2, A3 = B3  FROM A LEFT JOIN B ON A.ID = B.ID

个人感觉MS SQL Server的Update语法功能更为强大。MS SQL SERVER的写法:
UPDATE A SET A1 = B1, A2 = B2, A3 = B3 FROM A, B WHERE A.ID = B.ID

在Oracle和DB2中的写法就比较麻烦了,如下:

UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)
WHERE ID IN (SELECT B.ID FROM B WHERE A.ID = B.ID)

Mysql的写法是:

UPDATE A, B SET A1 = B1, A2 = B2, A3 = B3 WHERE A.ID = B.ID

最新文章

  1. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
  2. Asp.net mvc 添加Jquery UI
  3. 使用jekyll在GitHub Pages上搭建个人博客【转】
  4. Struts1 action重定向跳转 带参数
  5. MFC项目中包含atlimage.h导致fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include &lt;windows.h&gt;
  6. linux中Iptables限制同一IP连接数防CC/DDOS攻击方法
  7. 360兼容模式==ie8 兼容模式下 span标签占位问题
  8. mount nfs的可选参数
  9. &#39;adb&#39; 不是内部或外部命令,也不是可运行的程序
  10. java多线程的实现的两种方法
  11. EasyUI - Menu 菜单
  12. JSON序列化那点事儿
  13. python-希尔排序
  14. Thrift教程初级篇——thrift安装环境变量配置第一个实例
  15. Netty源码—六、tiny、small内存分配
  16. 从锅炉工到AI专家(11)(END)
  17. 详解Vue 开发模式下跨域问题
  18. 戳破ZigBee技术智能家居的谎言!
  19. 漫画|你还记得原生的JDBC怎么连接数据库吗?
  20. [UE4]碰撞机制

热门文章

  1. struts下载文件错误,想不明白为什么更改变量名就不报错了
  2. 长乐培训Day3
  3. Linux基础-02-目录文件管理
  4. OSI七层模型对应功能及协议
  5. Python--对list、tuple、dict的操作
  6. python + pyinstaller 实现将python程序打包成exe文件直接运行
  7. Scratch编程:快乐的小马(三)
  8. DataSource配置
  9. hdu 2181.。。。
  10. 区块链公链分片技术(sharding)方案思维导图