语句使我的SQL查询花费太长时间的条件

时间:2019-01-23 19:39:39

标签: sql sql-server

我有一个简单的查询,可以获取日期范围内所有订单的列表

这就是我查询的WHERE子句的样子

WHERE o.Company_Code = LEFT(@Site,2)
  AND o.Division_Code = RIGHT(@Site,3) 
  AND o.Customer_Number = 'ecom2x'
  AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate)
ORDER BY
    o.date_entered DESC

它通过读取参数站点来选择哪个公司,该站点的值类似于“ 09001”(在此查询生成的报告中选择)。

我想添加该功能以便能够查看所有公司的所有订单。因此,我在报表中添加了一个参数选项“全部”,其值为“ 00000”。

这是我的新WHERE子句。

WHERE 
    o.Customer_Number = 'ecom2x'
    AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate)
    AND ((@Site = '00000') OR (o.Company_Code = LEFT(@Site, 2) 
          AND o.Division_Code = RIGHT(@Site, 3))) 
ORDER BY
    o.date_entered DESC

这个想法是,如果站点参数为00000,则它不应检查订单的公司或部门代码。如果不是00000,那么它会定期检查它。

使用硬编码值运行此查询似乎可以正常工作,并且几乎可以立即为我提供结果,但是当我尝试将其作为报表运行时,它需要几分钟的时间,并且经常崩溃。

1 个答案:

答案 0 :(得分:2)

这可能是关于AND和OR的操作顺序。

尝试一下:

WHERE 
o.Customer_Number = 'ecom2x'
AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate)
AND ((@Site = '00000')
    OR 
    (o.Company_Code = LEFT(@Site,2) and o.Division_Code = RIGHT(@Site,3))) 
order by o.date_entered desc