如果可以包含表MasterStaging
(登台表)中的ID,我可以优化连接:
EXCEPT
中包含ID会导致结果失真,因为ID
中的MasterStaging
将始终与StatusComparison
不同MasterStaging.ID
无关紧要,只是一个自动编号,并不代表客户ID 如何获取ID top优化JOIN
?
这就是我想要的:
与以下相同的SQL,但我JOIN
仅使用ID
) x ON e.ID = x.ID
这是我到目前为止所做的:
UPDATE ecl.MasterStaging
SET NewAccount = 1
FROM ecl.MasterStaging e WITH (NOLOCK)
JOIN (
SELECT
ISNULL(Usable, 0) AS Usable ,
ISNULL(TypeRC, 0) AS TypeRC ,
ISNULL(CustomerNumber, 0) AS CustomerNumber ,
ISNULL(CustomerAccountNo, 0) AS CustomerAccountNo ,
ISNULL(LoadProfileClass, 0) AS LoadProfileClass ,
ISNULL(MeterNo, 0) AS MeterNo ,
ISNULL(PrimaryPhoneNumber, 0) AS PrimaryPhoneNumber ,
ISNULL(CustomerName1, 0) AS CustomerName1 ,
ISNULL(ServiceAddress1, 0) AS ServiceAddress1 ,
ISNULL(ServiceCity, 0) AS ServiceCity ,
ISNULL(ServiceState, 0) AS ServiceState ,
ISNULL(ServiceZip, 0) AS ServiceZip ,
ISNULL(BillingAddress1, 0) AS BillingAddress1 ,
ISNULL(BillingCity, 0) AS BillingCity ,
ISNULL(BillingState, 0) AS BillingState ,
ISNULL(substring(BillingZip, 1, 5), 0) as BillingZip ,
ISNULL(substring(BillingZip4, 7, 4), 0) as BillingZip4
FROM
ecl.MasterStaging WITH (NOLOCK)
EXCEPT
SELECT Usable ,
TypeRC ,
CustomerNumber ,
CustomerAccountNo ,
LoadProfileClass ,
MeterNo ,
PrimaryPhoneNumber ,
CustomerName1 ,
ServiceAddress1 ,
ServiceCity ,
ServiceState ,
ServiceZip ,
BillingAddress1 ,
BillingCity ,
BillingState ,
BillingZip ,
BillingZip4
FROM ecl.StatusComparison WITH (NOLOCK)
WHERE [Status] <> 'D'
) x
ON
ISNULL(e.Usable,0) = x.Usable AND
ISNULL(e.TypeRC,0) = x.TypeRC AND
ISNULL(e.CustomerNumber,0) = x.CustomerNumber AND
ISNULL(e.CustomerAccountNo,0) = x.CustomerAccountNo AND
ISNULL(e.LoadProfileClass,0) = x.LoadProfileClass AND
ISNULL(e.MeterNo,0) = x.MeterNo AND
ISNULL(e.PrimaryPhoneNumber,0) = x.PrimaryPhoneNumber AND
ISNULL(e.CustomerName1,0) = x.CustomerName1 AND
ISNULL(e.ServiceAddress1,0) = x.ServiceAddress1 AND
ISNULL(e.ServiceCity,0) = x.ServiceCity AND
ISNULL(e.ServiceState,0) = x.ServiceState AND
ISNULL(e.ServiceZip,0) = x.ServiceZip AND
ISNULL(e.BillingAddress1,0) = x.BillingAddress1 AND
ISNULL(e.BillingCity,0) = x.BillingCity AND
ISNULL(e.BillingState,0) = x.BillingState AND
ISNULL(e.BillingZip,0) = x.BillingZip AND
ISNULL(e.BillingZip4,0) = x.BillingZip4
答案 0 :(得分:1)
一个想法,但这可能不太理想:你可以在两个表上创建一个计算和持久列,它将计算所有列的校验和,你可以加入它。但是存在碰撞风险:
(我没有测试代码,让我知道是否有错误):
ALTER TABLE ecl.MasterStaging
ADD hash AS CHECKSUM(Usable ,
TypeRC ,
CustomerNumber ,
CustomerAccountNo ,
LoadProfileClass ,
MeterNo ,
PrimaryPhoneNumber ,
CustomerName1 ,
ServiceAddress1 ,
ServiceCity ,
ServiceState ,
ServiceZip ,
BillingAddress1 ,
BillingCity ,
BillingState ,
BillingZip ,
BillingZip4 ) PERSISTED
缺点: