我想我误解了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
--------+------------+-----------我想可能是索引把我搞糊涂了,但我确定没有索引,它仍然是这样的。
谁能解释一下为什么会发生这种情况,以及我误解了什么?
发布于 2013-05-06 19:26:50
此查询的内容:
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的所有事物。这并不矛盾。
您的第二个查询做了同样的事情,只是它要求两行除了key之外还共享id。
最后一个查询查找同时具有这两个属性的单行。这将返回一个空集,因为没有同时小于和大于1的值。
https://stackoverflow.com/questions/16397746
复制相似问题