SQL中关于EXISTS的嵌套子查询问题

SQL中关于EXISTS的嵌套子查询问题

SQL语句中,没有蕴含式和全程量词,所以这个时候,我们可以用离散数学的理论,将命题变化,然后使用EXISTS语句来查询,确实有点难以理解,下面我举一个例子来解释:

这是我对表的定义,一共使用两张表,orders和customers
对于查询来说,我们首先需要知道的是,要查询的最终内容是什么:

根据题目要求,我们不难得知,我们需要查询的是顾客姓名(也就是一个顾客,可以理解为姓名是他的一个属性),好,那现在需要一个什么样的顾客呢,需要一个查询至少购买过顾客“张三”购买过的全部零件的顾客,对于这个顾客而言,他身上有这个标签,我们可以把这个标签放进EXISTS/NOT EXISTS语句中,因为EXISTS语句中是一个bool表达式,对于查询的所有顾客,一旦他满足这个表达式,就放入结果中。

然后我们确定,到底这个“标签”该怎么去写,我们将命题符号化

p:张三买过零件y

q:存在一个x,买过零件y

正常我们需要满足p->q,但是不能实现,经过命题的化简,我们可以化简为,不存在这样一个人叫张三且他买过的全部零件x没买过。

这里要使用not exists语句

/*查询至少购买过顾客“张三”购买过的全部零件的顾客姓名。*/
SELECT DISTINCT C_NAME FROM CUSTOMER C1
WHERE NOT EXISTS
(
SELECT *FROM CUSTOMER C2,LINEITEM L2,ORDERS O2
WHERE C2.C_NAME='张三' AND O2.O_CUSTKEY=C2.C_CUSTKEY AND L2.L_ORDERKEY=O2.O_ORDERKEY
AND NOT EXISTS 
(
SELECT *FROM LINEITEM L3,ORDERS O3
WHERE(C1.C_CUSTKEY=O3.O_CUSTKEY AND L3.L_PARTKEY=L2.L_PARTKEY AND L3.L_ORDERKEY=O3.O_ORDERKEY)
)
)
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值