存在于 PostgreSQL 中不清楚

索米亚

我很难理解 EXISTS 在以下查询中究竟在做什么,

select basket_a.* from basket_a where exists (select from basket_b where basket_b.fruit <> basket_a.fruit);

为什么上面查询的输出是整个的basket_abasket_a包含

Apple
Orange
Banana
Cucumber

basket_b包含

Orange
Apple
Watermelon
Pear

困难源于我对类似查询的半解

select basket_a.* from basket_a where exists (select from basket_b where basket_b.fruit = basket_a.fruit);

输出:

苹果橙

我假设对子查询进行评估以确定它是否返回任何行。所以,basket_b.fruit = bag_a.fruit返回两行

苹果橙

至少不止一行因此对于这两行,where 存在评估为真,并且因为它对于不匹配的其他两行评估为假。因此,选择了来自basket_a 的匹配行。就我的理解而言,我在这里是否正确?如果是这样,basket_b.fruit <> bag_a.fruit返回

西瓜梨

同样,子查询返回两行。不幸的是,西瓜和梨不在篮子中,这是否意味着结果where EXISTS为假并select * from basket_a应返回所有行?EXISTS是应该的行为吗?

保护者

您遇到的问题是误解了 EXISTS 的作用。它从不返回列值,它总是返回单个 BOOLEAN 值。该布尔值由子选择的 where 条件决定。子选择的真实处理瞬间终止并返回真。如有必要,对外部查询中的每一行重复。

  pseudo code  
    for each element in ba
        for each element in bb
            if ba.element OPER bb.element 
               return true               
        end for
    end for 
    return false
  end pseudo code

有关实际示例,请参阅fiddle特别注意第三个查询,它实际测试 EXISTS,其中元素对于同一集合不同,而不是具有相同值的集合,但实际上是相同的集合。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章