了解条件上自联接的行为

时间:2014-07-22 18:49:50

标签: sql sql-server sql-server-2008 tsql sql-server-2012

我继承了以下代码(仅限第一个块),但不了解

之间的区别
UPDATE Contact2 
SET Contact2.gbs_contactid = Contact1.gbs_contactId 
FROM gbs_sourcecontact Contact2 
INNER JOIN gbs_sourcecontact Contact1 
ON Contact1.gbs_sourcecontactid = '90BFC45B-8C75-4054-89D0-5400B225108C' 
WHERE Contact2.gbs_sourcecontactid =' E83C4FF3-4298-4CF3-8718-6CF987CE5803'

UPDATE Contact2 
SET Contact2.gbs_contactid = Contact1.gbs_contactId 
FROM gbs_sourcecontact Contact2 
INNER JOIN gbs_sourcecontact Contact1 
ON Contact1.gbs_sourcecontactid = '90BFC45B-8C75-4054-89D0-5400B225108C' 
AND Contact2.gbs_sourcecontactid =' E83C4FF3-4298-4CF3-8718-6CF987CE5803'

UPDATE Contact2 
SET Contact2.gbs_contactid = Contact1.gbs_contactId 
FROM gbs_sourcecontact Contact2 
INNER JOIN gbs_sourcecontact Contact1 
ON Contact2.gbs_sourcecontactid =' E83C4FF3-4298-4CF3-8718-6CF987CE5803'
WHERE Contact1.gbs_sourcecontactid = '90BFC45B-8C75-4054-89D0-5400B225108C' 

我理解内连接的概念;但是,在这个特定情况下,我不理解切换ON/WHERE子句时发生的行为。

如何切换ON / WHERE子句会影响结果?

1 个答案:

答案 0 :(得分:2)

onwhere子句之间切换条件不会影响内部联接的结果(请参阅下面的警告)。这些" join" s令人困惑,因为表之间没有真正的联系。你只是从表中选择(大概)单行并匹配它们。

我倾向于以第二种方式编写连接,on子句中包含两个条件。 onwhere条款中的混合条件会导致混淆 - 以及诸如你的问题。

警告:如果Contact1中存在多个匹配项,则会为更新选择其中一个值(来自任意匹配行的值)。在on子句与where子句中放置条件可能不会影响执行计划。但是,你永远不会知道。在这种情况下,可能会有小的差异导致不同的更新。