-1

该语句运行了很长时间并且不返回任何内容。我究竟做错了什么?

SELECT *
  FROM supplierdata AS s1
 WHERE s1.zip IN (
    SELECT zip
      FROM supplierdata AS s2
     WHERE s1.zip = s2.zip
           );
4

3 回答 3

4

您的语句只是运行了很长时间,因为它效率低下。

但是,首先,该查询实际上没有意义。以下将是等效的:

select *
from supplierdata
where zip is not null

我建议您终止查询并在supplierdata(zip). 这应该会大大提高查询的性能。

本质上,您的查询正在为supplierdata. 这是非常昂贵的,需要对表进行全表扫描。索引应该解决这个问题。

于 2013-03-26T13:26:16.637 回答
1

除了“这没有任何意义”:

select * 
from supplierdata as s1 
where s1.zip IN 
(select zip from supplierdata as s2 where s2.zip between 200 and 300);

它相当于

select * 
from supplierdata as s1 
where s1.zip 
between 200 and 300;

等等......只是没有任何意义......如果你解释你试图完成的事情应该会更好;)

或任何不引用父查询的条件;你的循环不是无限的,它只是很长,因为首先它会逐行运行,就像@Nix 说的那样

于 2013-03-26T13:33:54.853 回答
1

你的人数很差,所以你的查询基本上是:

  1. 对于供应商数据中的每一行
  2. 查询我当前行的整个供应商数据 zip
  3. 如果我发现了什么,请选择它
  4. 重复。

实现相同目标的更简单方法。从供应商数据 s1 中选择 count(1),其中 zip 不为空

于 2013-03-26T13:26:32.933 回答