如何从SQL Server中的联接替换OR语句

时间:2018-10-10 11:41:49

标签: sql tsql

我有以下查询,该查询在联接上使用or语句,因此,基本上,如果不满足联接上的一个条件,则必须检查下一个条件。问题是使用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 :(得分:2)

根据逻辑上的分配规则,

P OR(Q AND R)可以写成 (P或Q)和(P或R)..也许有帮助吗?

答案 1 :(得分:1)

您可以尝试使用左联接和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'

答案 2 :(得分:0)

您可以尝试以下查询:

 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'