我很难理解 EXISTS 在以下查询中究竟在做什么,
select basket_a.* from basket_a where exists (select from basket_b where basket_b.fruit <> basket_a.fruit);
为什么上面查询的输出是整个的basket_a
?basket_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] 删除。
我来说两句