带有“exists”子句和多个表的 SQL 子查询
Posted
技术标签:
【中文标题】带有“exists”子句和多个表的 SQL 子查询【英文标题】:SQL subqueries with 'exists' clause and multiple tables 【发布时间】:2021-12-26 20:24:36 【问题描述】:抱歉,发布图片的声誉不够。我有 3 个 SQL 表:
x1: 'a':1,2,3,4,5,
x2: 'c':1,1,1,2,2,3,3, 'd':1,3,5,1,3,1,1,
x3: 'b':1,3,5
查询是:
select a from x1
where not exists (
select * from x3
where not exists (
select *
from x2
where x1.a = x2.c and x3.b=x2.d
)
)
以下查询的结果是“1”,但我不明白为获得该结果所采取的步骤。
在哪个子查询中返回什么?
【问题讨论】:
建议... 编辑您现有的帖子。您的数据表样本过于笼统。虽然我们可以给你解释,但最好有适当的上下文。如果与客户、订单、产品或类似的东西打交道,就这样做,而不是我们试图猜测这个人为什么会想要这样一个奇怪的查询。甚至可能是更好的做法和解释,包括为您的长期解决方案考虑的优化选项。顺便说一句,欢迎来到 S/O。 【参考方案1】:我会尽力解释。您的查询将从表 a 中获取结果集为
的记录为空(即由不存在断言)
考虑表格中的数据
a 中的值是 1,2,3,45
让我们检查 a=1
我们在表 x2 中反对 a=1 和 c=1 三个记录
对于这 3 条记录,所有 d 列的值都存在于表 x3 中。这意味着块的输出将在 a=1 时返回空,因此将出现在最终输出中。
检查 a=2,d 中的可能值为 1 和 3,当我们在表 x3 中得到 5 时,查询将返回非空结果
对于 a=3 类似,内部查询从表 x3 中返回 3 和 5
对于a=45,由于a在表x2中不存在,所以返回表x3的所有记录 -> 1,3,5
因此,唯一满足空结果集的 a 是 a=1,即答案。
【讨论】:
以上是关于带有“exists”子句和多个表的 SQL 子查询的主要内容,如果未能解决你的问题,请参考以下文章
带有“Exists”子句的子查询,其中需要从两个表中收集信息
Oracle where exists 子句不适用于 SQL Plus