SQLServer使用where和inner join去update有什么区别?哪个效率更好?

时间:2022-07-07 02:25:29
第一种使用where的写法去更新数据:
                
UPDATE  TA		
SET  TA.IsDetailDisplay =  TB.Isdetaildisplay,
TA.Sortno = TB.Sortno,
TA.modified = getdate()
From Mstinventorysheetsbybranch TA,#XMLTbData TB
where TA.Branchcd = TB.Branchcd  
and TA.Inventorysheetno = TB.Inventorysheetno 
and TA.Inventorysheetline = TB.Inventorysheetline 
and exists(select 'X' from #XMLTbData TC 
where TA.Branchcd = TC.Branchcd  
and TA.Inventorysheetno = TC.Inventorysheetno 
and TA.Inventorysheetline = TC.Inventorysheetline 
)


第二种使用inner join的写法去更新数据:
UPDATE  TA		
SET  TA.IsDetailDisplay =  TB.Isdetaildisplay,
TA.Sortno = TB.Sortno,
TA.modified = getdate()
From Mstinventorysheetsbybranch TA inner join #XMLTbData TB
on TA.Branchcd = TB.Branchcd  
and TA.Inventorysheetno = TB.Inventorysheetno 
and TA.Inventorysheetline = TB.Inventorysheetline 

请问这2种写法有什么区别?哪个效率更高一些?

5 个解决方案

#1


肯定inner join效率高啊,第一个方法还有一个subselect啊

#2


inner join效率高,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。 

因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用

#3


引用 1 楼 shoppo0505 的回复:
肯定inner join效率高啊,第一个方法还有一个subselect啊

请问如果换成merge的话
如何在update和insert里加where条件?

#4


你把第一种的 and exists(...) 去掉,这是多此一举的条件(同一个表中至少存在当前记录是匹配的,条件永远为真)。
去掉后两种写法是等价的。

#5


引用 3 楼 xianying7509 的回复:
Quote: 引用 1 楼 shoppo0505 的回复:

肯定inner join效率高啊,第一个方法还有一个subselect啊

请问如果换成merge的话
如何在update和insert里加where条件?

WHEN MATCHED and TD.XXXX = '0'我会写了。

#1


肯定inner join效率高啊,第一个方法还有一个subselect啊

#2


inner join效率高,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。 

因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用

#3


引用 1 楼 shoppo0505 的回复:
肯定inner join效率高啊,第一个方法还有一个subselect啊

请问如果换成merge的话
如何在update和insert里加where条件?

#4


你把第一种的 and exists(...) 去掉,这是多此一举的条件(同一个表中至少存在当前记录是匹配的,条件永远为真)。
去掉后两种写法是等价的。

#5


引用 3 楼 xianying7509 的回复:
Quote: 引用 1 楼 shoppo0505 的回复:

肯定inner join效率高啊,第一个方法还有一个subselect啊

请问如果换成merge的话
如何在update和insert里加where条件?

WHEN MATCHED and TD.XXXX = '0'我会写了。