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)
)
)