关于update set from,第一次碰到,汗!

下面是这样一个例子:

两个表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)

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)

 

你可能感兴趣的:(oracle,sql,SQL Server,db2,Sybase)