首页 > 解决方案 > 存在于 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 = basket_a.fruit返回两行

苹果橙

这至少不止一排。因此where exists对这两行的计算结果为真,因为它对另外两行不匹配的结果为假。因此,将选择来自 basket_a 的匹配行。就我的理解而言,我在这里是否正确?如果是这样,则 basket_b.fruit <> basket_a.fruit返回

西瓜梨

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

标签: sqldatabasepostgresql

解决方案


请注意:

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

不一样:

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

后者导致每一行,因为 中存在一行basket_b,不等于 中的当前行basket_a。您正在寻找的是前一个查询。


推荐阅读