执行查询时出现“IN”问题

时间:2009-03-10 12:39:22

标签: sql mysql

我正在尝试根据他们的代码和部门搜索员工。

我使用IN运算符触发了一个查询,该运算符有1200个员工代码。当我执行查询时,我得到一个例外(“IN中允许的最多1000条记录”)。

任何人都可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:5)

将这些记录上传到临时表并使用连接几乎肯定会更快。实际上,解析器必须为IN构建一个巨大的条件树。

注意:我不知道MYSQL是否支持Oracle或SQLServer的事务级临时表,但即使是“真正的”表也应该更快,特别是如果创建一次并重用。当然,有许多变量,例如批量插入到该表的能力,写入事务日志的成本,& c。

重读您的问题:您从哪里获得这些员工代码?你可以从桌子上或加入吗?

答案 1 :(得分:1)

许多DBMS不允许像

这样的查询
SELECT * FROM table WHERE col IN (...)

列表中包含超过1,000个值。也许可以使用少于1,000个值的块来分割它:

SELECT * FROM table WHERE col IN (...) OR col IN (...)

SELECT * FROM table WHERE col IN (...)
UNION
SELECT * FROM table WHERE col IN (...)

(虽然没有意义,也不太可行)。

否则,您应该将值存储在临时表中并使用JOIN代替。你从哪里获得1,200个代码 - 它们不会出现在同一个数据库中? :)

答案 2 :(得分:0)

创建一个(临时)表格,其中包含您的员工代码,填写并查询如下:

SELECT *
FROM mytable
WHERE empcode IN (SELECT mycode FROM temptable)

答案 3 :(得分:0)

创建内存临时表(仅限小表),填充存储过程结果。在临时表上执行带连接的选择。删除临时表。

CREATE TEMPORARY TABLE ENGINE=MEMORY tmp AS 
  SELECT code FROM employee; // in-memory temporary table (small tables)

SELECT col1, col2 FROM table 
    INNER JOIN tmp ON table.code = tmp.code; // join faster than subquery

DROP TEMPORARY TABLE tmp; // cleanup temporary table