Как заменить оператор OR из объединения в SQL Server - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующий запрос, который использует оператор или в соединении, поэтому, в основном, если не выполнено одно условие в соединении, он должен проверить следующее условие.Проблема заключается в том, что с оператором OR требуется действительно много времени, но когда я удаляю одно из условий OR, оно выполняется мгновенно.есть ли лучший способ сделать это с обоими условиями без использования оператора OR, чтобы он ускорил запрос

  select t5.TransactionNumber
        ,t4.ID
        ,t3.[Entry] AS Amount 
        ,t2.Address AS AddressDetail
        ,t1.PhoneNumber   AS  ContactNumber
  FROM Table1 t1 (NOLOCK)
  JOIN Table2 t2 (NOLOCK) ON t2.FicaID = t1.FicaId 
  inner  join Table3 t3 (NOLOCK) ON (t3.ID = t2.ID AND t3.Code = t2.Code) or (t3.TypeID = t2.TypeID)  //on this join i have an or statement if one condition isnt met it must check the next condition
  LEFT JOIN Table4 t4 (NOLOCK) ON t4.Result = t3.Result
  LEFT JOIN Table5 t5 (NOLOCK) ON t5.AccNum = t3.AccNum
  where t1.date>'2018-09-01' and t1.date<'2018-09-30'

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Вы можете попробовать использовать левое соединение и функцию COALESCE

select t5.TransactionNumber
        ,t4.ID
        ,COALESCE(t3.[Entry],t33.[Entry]) AS Amount 
        ,t2.Address AS AddressDetail
        ,t1.PhoneNumber   AS  ContactNumber
  FROM Table1 t1 (NOLOCK)
  JOIN Table2 t2 (NOLOCK) ON t2.FicaID = t1.FicaId 
  left  join Table3 t3 (NOLOCK) ON (t3.ID = t2.ID AND t3.Code = t2.Code)
  left join Table3 t33  (t33.TypeID = t2.TypeID)  //I moved it to left join
  LEFT JOIN Table4 t4 (NOLOCK) ON t4.Result = t3.Result
  LEFT JOIN Table5 t5 (NOLOCK) ON t5.AccNum = t3.AccNum
  where t1.date>'2018-09-01' and t1.date<'2018-09-30'
0 голосов
/ 10 октября 2018

По правилу дистрибутивности в логике,

P ИЛИ (Q И R) можно записать как (P ИЛИ Q) И (P ИЛИ R) .. может быть, это помогает?

0 голосов
/ 10 октября 2018

Вы можете попробовать ниже запрос:

 select * from
 (
  select t5.TransactionNumber
        ,t4.ID
        ,t3.[Entry] AS Amount 
        ,t2.Address AS AddressDetail
        ,t1.PhoneNumber   AS  ContactNumber
         FROM Table1 t1 (NOLOCK)
        JOIN Table2 t2 (NOLOCK) ON t2.FicaID = t1.FicaId 
        inner  join Table3 t3 (NOLOCK) ON (t3.ID = t2.ID AND t3.Code = t2.Code)
        )A
         join Table3 t3 (NOLOCK) ON (A.TypeID = t3.TypeID)   

        LEFT JOIN Table4 t4 (NOLOCK) ON t4.Result = t3.Result
        LEFT JOIN Table5 t5 (NOLOCK) ON t5.AccNum = t3.AccNum
        where t1.date>'2018-09-01' and t1.date<'2018-09-30'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...