首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套SQL (IN & EXISTS) with group by返回相互矛盾的结果

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

Stack Overflow用户
提问于 2013-05-06 19:24:49
回答 1查看 367关注 0票数 1

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

代码语言:javascript
运行
复制
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;

我得到了以下结果:

代码语言:javascript
运行
复制
  id    | key        | value
--------+------------+-----------
  92    |         18 |         2
   4    |         18 |         2

类似地,当我尝试这个查询时:

代码语言:javascript
运行
复制
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;

我得到了相同的结果:

代码语言:javascript
运行
复制
  id    | key        | value
--------+------------+-----------
  92    |         18 |         2
   4    |         18 |         2

最后,当我尝试这样做时,我得到了正确的结果:

代码语言:javascript
运行
复制
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
--------+------------+-----------

我想可能是索引把我搞糊涂了,但我确定没有索引,它仍然是这样的。

谁能解释一下为什么会发生这种情况,以及我误解了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-06 19:26:50

此查询的内容:

代码语言:javascript
运行
复制
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的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16397746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档