Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 执行查询时“IN”出现问题_Sql_Mysql - Fatal编程技术网

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

Sql 执行查询时“IN”出现问题,sql,mysql,Sql,Mysql,我试图根据员工的代码和部门搜索他们 我触发了一个使用IN运算符的查询,该运算符有1200个员工代码。当我执行查询时,我得到了一个允许的最大1000条记录的异常 有人能帮我解决这个问题吗 将这些记录上传到临时表并使用联接几乎肯定会快得多。实际上,解析器必须为IN构建一个巨大的条件树 注意:我不知道MYSQL是否支持Oracle或SQLServer的事务级临时表,但即使是真正的表也应该更快,特别是如果创建一次并重用的话。当然,有很多变量,比如批量插入表的能力、编写事务日志的成本等等 重读你的问题:你

我试图根据员工的代码和部门搜索他们

我触发了一个使用IN运算符的查询,该运算符有1200个员工代码。当我执行查询时,我得到了一个允许的最大1000条记录的异常


有人能帮我解决这个问题吗

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

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


重读你的问题:你从哪里得到这些员工代码?您可以从表或联接中获取它们吗?

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

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


重读你的问题:你从哪里得到这些员工代码?您可以从表或join中获取它们吗?

创建一个临时表,该表将包含您的员工代码,并按如下方式填充和查询:

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

创建一个临时表,该表将包含您的员工代码,并按如下方式填写和查询:

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

许多DBMS不允许这样的查询

SELECT * FROM table WHERE col IN (...)
列表中的值超过1000个。也许可以使用小于1000个值的块将其拆分:

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

尽管这没有意义,也不太可能奏效


否则,应将值存储在临时表中,并改用联接。您从哪里获得1200个代码-它们不在同一数据库中

许多数据库管理系统不允许这样的查询

SELECT * FROM table WHERE col IN (...)
列表中的值超过1000个。也许可以使用小于1000个值的块将其拆分:

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

尽管这没有意义,也不太可能奏效


否则,应将值存储在临时表中,并改用联接。您从哪里获得1200个代码-它们不在同一数据库中

仅创建内存中的临时表小表,用存储过程结果填充。使用临时表上的联接执行选择。放下临时桌子

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

创建内存中的临时表—仅创建小表,用存储过程结果填充。使用临时表上的联接执行选择。放下临时桌子

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

你真的想看到一个有1200个条目的IN语句吗?哦,你的评论让我意识到我问错了;-Thank.SELECT*FROM t1 a internal JOIN t2 b ON a.cod=b.emp_code JOIN t3 c ON b.t2_id=c.t3_t2_id其中t1.cod在'SHBL72'中你真的想看到一个包含1200个条目的IN语句吗?哦,你的评论让我意识到我问错了;-Thank.SELECT*FROM t1 a internal JOIN t2 b ON a.cod=b.emp_code JOIN t3 c ON b.t2_id=c.t3_t2_id其中t1.cod在'SHBL72'中是从其他数据库表获取员工代码的存储过程调用。是从其他数据库表获取员工代码的存储过程调用。在查询中使用多个代码好吗。它不会影响DBMS的智能化程度的性能依赖。使用带有索引列的临时表可能更快。坦白地说,重构表可能是个好主意!在查询中使用多个是好的吗。它不会影响DBMS的智能化程度的性能依赖。使用带有索引列的临时表可能更快。坦白地说,重构表可能是个好主意!这会更快吗?因为我已经有了从其他表获取员工代码的存储过程。这会更快吗?因为我已经有了从其他表获取员工代码的存储过程