嵌套SQL(IN& EXISTS)与group by返回相互矛盾的结果

时间:2013-05-06 11:24:49

标签: sql postgresql

我想我误解了SQL。当我尝试以下矛盾的查询时:

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 个答案:

答案 0 :(得分: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;

是,查找关键key的所有内容,其中包含value < 1行和value > 1行。这并不矛盾。

您的第二个查询执行相同的操作,但除了id之外,它要求两行共享key

您的上一个查询会查找包含这两个属性的单行。返回一个空集,因为没有值小于和大于一。