2013-03-26 55 views
-1

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

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

这条SQL语句没有任何意义。你想达到什么目的? – 2013-03-26 13:26:00

+0

我只想知道sql语句是如何进入无限循环以及处理多长时间的。 – 2013-03-26 13:35:30

+0

嗨@NimeshSoni,迟早这个问题将被关闭。为了提出更好的问题,你也可以解释你想要达到的目标。这个SQL没有任何意义。 – Ramesh 2013-03-26 15:48:50

回答

4

由于效率低下,您的声明运行很长很长一段时间。

首先,查询并没有真正意义。以下是等价的:

select * 
from supplierdata 
where zip is not null 

我建议你杀了查询和supplierdata(zip)建立索引。这应该会大大提高查询的性能。

实际上,您的查询正在为supplierdata的每一行运行子查询。这非常昂贵,需要对表格进行全表扫描。索引应该解决这个问题。

1

你正在做一个非常贫穷的男人的,所以你的查询将基本上是:

  1. 在supplierdata
  2. 查询每一行对我目前的行整个supplierdata ZIP
  3. ,如果我发现了一些选择它
  4. 重复。

更简单的方法来达到同样的。 选择 计数(1) 从 supplierdata S1 其中 拉链不为空

+0

我只想比较1条记录和其他所有条目,反之亦然。 – 2013-03-26 13:41:11

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所说

+0

你的回答是对的,但我不想使用'之间'。 – 2013-03-26 13:40:30

+0

你想完成什么...我可以帮你;) – Hackerman 2013-03-26 13:44:51