我想我误解了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
--------+------------+-----------
我想也许索引在弄乱我,但我确定没有,它仍然表现得像这样。
有人可以解释为什么会发生这种情况以及我误解了什么?
答案 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
。
您的上一个查询会查找包含这两个属性的单行。返回一个空集,因为没有值小于和大于一。