2013-06-12 175 views
1

我创建了以下性能不佳的更新。我觉得可能有更容易或更有效的方式来进行查询,而不是我的蛮力尝试。请帮忙。使用子查询进行TSQL更新

Update LocalServers 
set MustIPL = 1 
where LocalServerID IN (SELECT distinct olu.LocationID 
         from OfferLocUpdate olu with (NoLock) 
         Join LocalServers ls WITH (NOLOCK) on olu.LocationID = ls.LocationID 
         Join CPE_IncentiveDLBuffer DLB with (NoLock) on olu.OfferID = dlb.OfferID 
         where 
          olu.LastSent > IncentiveLastHeard 
          and CreationDate < dateadd(d, [email protected], getdate()) 
          and DLB.FileName LIKE '%IDL-A') 

回答

1

试试这个:

DECLARE @DateNow DATETIME 
    SET @DateNow = GETDATE() 

    ;WITH cte_DLB (OfferID, [FileName]) AS 
    (
     SELECT OfferID, [FileName] 
     FROM CPE_IncentiveDLBuffer (NOLOCK) 
     WHERE DLB.[FileName] LIKE '%IDL-A' 
    ) 
    UPDATE 
     LS 
    SET 
     LS.MustIPL = 1 
    FROM 
     LocalServers LS 
     JOIN OfferLocUpdate OLU (NOLOCK) ON LS.LocalServerID = OLU.LocationID 
     JOIN LocalServers ls (NOLOCK) ON OLU.LocationID = LS.LocationID 
     JOIN cte_DLB ON OLU.OfferID = cte_DLB.OfferID 
    WHERE 
     OLU.LastSent > IncentiveLastHeard 
     AND CreationDate < dateadd(d, [email protected], @DateNow) 

这将是非常有益的,如果你明确哪个表属于列 'IncentiveLastHeard' & 'CreationDate'