我正在尝试根据他们的代码和部门搜索员工。
我使用IN运算符触发了一个查询,该运算符有1200个员工代码。当我执行查询时,我得到一个例外(“IN中允许的最多1000条记录”)。
任何人都可以帮我解决这个问题。
答案 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