2013-11-14 4 views
0

я мог бы оптимизировать присоединиться, если я мог бы включать в себя идентификатор из таблицы MasterStaging (промежуточной таблицы):Оптимизировать TSQL За исключением

  • Включая идентификатора в EXCEPT приведет к искажению результатов со временем ID от MasterStaging всегда будет отличаться от StatusComparison
  • MasterStaging.ID не имеет значения, просто AutoNumber, и не представляет идентификатор клиента
  • SQL, разработан, чтобы показать отсутствие клиентов, независимо от ID.
  • CustomerAccountNo не уникальный номер

Как я могу включать получить идентификатор сверху оптимизировать 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 

ответ

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 

недостатки:

    более
  • хранения
  • больше вычислений при вставках и обновлениях
  • Вам необходимо изменить структуру таблицы
  • это не будет wo rk, если вам нужно сравнить на LOB
+0

Спасибо за идею .... –

Смежные вопросы