sql - 存在于 PostgreSQL 中不清楚
问题描述
我很难理解 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 = basket_a.fruit返回两行
苹果橙
这至少不止一排。因此where exists对这两行的计算结果为真,因为它对另外两行不匹配的结果为假。因此,将选择来自 basket_a 的匹配行。就我的理解而言,我在这里是否正确?如果是这样,则 basket_b.fruit <> basket_a.fruit返回
西瓜梨
同样,子查询返回两行。不幸的是,篮子a中不存在西瓜和梨,这是否意味着结果where EXISTS
为假并且select * from basket_a
应该返回所有行?这EXISTS
是应该的行为方式吗?
解决方案
请注意:
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
。您正在寻找的是前一个查询。
推荐阅读
- python - Django 登录使用函数错误:join() 参数必须是 str 或字节,而不是“用户”
- html - 如何在 MatTable 行上实现 OnClick 操作?
- google-apps-script - 从 Google 文档段落复制的图像插入了两次
- cdap - table-lookup 指令找不到准备数据的现有表
- azure-active-directory - Microsoft Graph API 获取联系信息
- java - Spring Integration Java DSL SFTP如何在处理程序中获取远程SFTP服务器信息
- javascript - 在(js)中加载新元素时如何重新定位HTML元素?
- c# - 如何将数据从模型 (MVC) 传递到 @url.Action() 以绘制图表
- javascript - 在 JS/PHP 中获取当前位置
- python - 使用多个进程和队列时优雅地处理键盘中断