很长的SQL查询,可以进行优化

时间:2015-09-14 12:34:34

标签: mysql sql database

我有一个很长的SQL查询,它有一个标准格式

select * 
  from salary 
 where employe_id = 101 
    OR employe_id = 102 
    OR employe_id = 103 
    OR employe_id = 104 
    OR employe_id = 105 
........................ repeated 1000's of times.

我的问题是sql查询的最大长度。这可能是我设计的瓶颈。

我的问题是,

  

有没有办法优化此查询以说出where employe_id = 101, 102, 103

之类的内容

或者更好

  

有没有办法优化此查询,例如where employe_id = <a csv file>

我需要将其limitless

3 个答案:

答案 0 :(得分:8)

有几种方法可以做到:

select * from salary where employee_id IN(101, 102 ... 105); 
select * from salary where employee_id BETWEEN 101 AND 105;
select * from salary where employee_id >= 101 AND  employee_id <= 105;

答案 1 :(得分:2)

我认为您必须使用外部应用程序才能使用csv文件。

为了提高查询效率,请使用&#34; in&#34;关键词。

    Where employee_id in (1000,1001,1002, ....)

编辑:只有在您首先对数据进行排序或以其他方式知道范围时,BETWEEN才会起作用。您的问题中没有任何内容表明您知道范围或数据的排序。因此,最好的情况是使用IN。

您可以使用您选择的编程语言循环访问外部文件,也可以将ID导入单独的表格,并使用子查询从那里填充查询。

答案 2 :(得分:2)

您可以选择几条路线,但基本想法如下:

  • WHERE谓词中包含您要过滤的ID。您可以使用INBETWEEN运营商。

    SELECT * FROM Salary WHERE EmployeeID in (101, 102, ..., 1000)
    
    SELECT * FROM Salary WHERE EmployeeID BETWEEN 101 and 1000
    
  • 从CSV或其他输入创建表格并加入其中。这可以使用临时对象(临时表,CTE或表值函数)来完成。或者,您可以将文件加载到基于磁盘的对象,例如dbo.EmployeeIDFromCSV。这可以使用BULK INSERT语句或SSIS包来完成。