带有“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 子查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的子查询中FROM和EXISTS子句的使用教程

带有“Exists”子句的子查询,其中需要从两个表中收集信息

Oracle where exists 子句不适用于 SQL Plus

SQL Group By and Have 子句和 exists 子句

存在带有 HAVING 子句的子查询

EXISTS 子句在 SQL Server 中如何工作?