我有一个很长的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
。
答案 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。您可以使用IN
或BETWEEN
运营商。
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包来完成。