2013-03-26 116 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