G-天,
我对以下内容感到有些困惑。 当我运行此查询时,需要很长时间才能解决:
Select *
from test
where id in (select id from test2 where customer = 'HARRY');
当我自己运行子查询时,它会在spit second中解析为'13454'。 当我将主要查询的where语句更改为('13454')时,它也会立即解析。
有人知道它为什么不以原始格式运行?
干杯,
雷
答案 0 :(得分:1)
原因是MySQL的怪癖。子查询是为外表的每一行执行的。
要解决此问题,请使用exists
:
Select *
from test
where exists (select id from test2 where test2.customer = 'HARRY' and test2.id = test.id);
如果您在test2(customer, id)
上有索引,这将最有效。
我应该补充一点,这取决于MySQL的版本(我认为它在5.5中已修复)。较早的documentation将其解释为:
考虑以下子查询比较:
outer_expr IN(SELECT inner_expr FROM ... WHERE subquery_where)
的MySQL 从外到内评估查询。也就是说,它首先获得 外部表达式outer_expr的值,然后运行 子查询并捕获它产生的行。
答案 1 :(得分:0)
使用JOIN
SELECT DISTINCT a.*
FROM Test a
INNER JOIN Test2 b
ON a.ID = b.ID
WHERE b.customer = 'Harry'
为了提高性能,请确保两个表上的ID
都有KEY
。