2013-05-06 127 views
1

我想我誤解了SQL。當我嘗試了以下矛盾查詢:嵌套SQL(IN&EXISTS)與group by返回矛盾結果

SELECT id, key, value FROM Things WHERE value > 1 AND key = 'key' AND id IN (
    SELECT id 
    FROM Things 
    WHERE key = 'key' AND value < 1 
) GROUP BY id, key, value LIMIT 2; 

我得到如下結果:

id | key  | value 
--------+------------+----------- 
    92 |   18 |   2 
    4 |   18 |   2 

同樣的,當我嘗試此查詢:

SELECT id, key, value FROM Things a WHERE value > 1 AND key = 'key' AND EXISTS (
    SELECT * 
    FROM Things b 
    WHERE a.id = b.id AND a.key = b.key AND b.value < 1 
) GROUP BY id, key, value LIMIT 2; 

我得到相同的結果:

id | key  | value 
--------+------------+----------- 
    92 |   18 |   2 
    4 |   18 |   2 

最後當我試試這個,我得到正確的結果:

SELECT X.id, X.key, X.value FROM (
    SELECT id, key, value 
    FROM Things 
    WHERE key = 'key' and value < 1 
) AS X WHERE X.key = 'key' AND X.value > 1 GROUP BY id, key, value LIMIT 2; 

    id | key  | value 
--------+------------+----------- 

我想也許指標進行跟我搗亂,但我確信,還有非和它仍然表現這樣。

有人可以解釋爲什麼會發生這種情況,以及我誤解了什麼?

回答

1

什麼這個查詢說:

SELECT id, key, value FROM Things WHERE value > 1 AND key = 'key' AND id IN (
    SELECT id FROM Things WHERE key = 'key' AND value < 1 
) GROUP BY id, key, value LIMIT 2; 

是,尋找一切事物與它既有與value < 1行與value > 1一個行存在關鍵key。這並不矛盾。

你的第二個查詢做同樣的事情,除了它要求兩個行共享id以及key

最後一個查詢查找具有兩個屬性的單個行。這將返回一個空集,因爲沒有值小於和大於1。

+0

太好了,謝謝!我認爲這就是我誤解的原因。 – Dan 2013-05-06 12:01:20