数据库表的结构如下:
customer: custkey name comment
lineitem:orderkey partkey comment
orders:orderkey custkey
part: partkey name
请问如何用双层 exists 嵌套查询至少购买过顾客“齐光远”购买过的全部零件的顾客姓名。
select name from customer where custkey exists (select custkey from orders where orderkey exists (select custkey from customer where name = '齐光远'))
1、必须使用双层exists吗?这种方式要体现“全部零件”更为复杂:
非双层exists方式:
SELECT ( SELECT name FROM custromer c WHERE c.custkey = b.custkey ) name
FROM ( SELECT DISTINCT o.custkey, l.partkey, count( 1 ) OVER( ) cnt
FROM orders o JOIN lineitem l ON o.orderkey = l.orderkey AND custkey = ( SELECT custkey FROM customer WHERE name = '齐光远' ) ) a
JOIN ( SELECT DISTINCT o.custkey, l.partkey
FROM orders o JOIN lineitem l ON o.orderkey = l.orderkey ) ON a.partkey = b.partkey AND a.custkey != b.custkey
GROUP BY b.custkey, a.cnt
HAVING count( b.partkey ) = a.cnt
双层exists方式(甚至可以写成三层exists方式):
SELECT name
FROM customer c
WHERE EXISTS( SELECT 1
FROM ( SELECT o.custkey
FROM orders o JOIN lineitem l ON o.orderkey = l.orderkey
WHERE EXISTS( SELECT 1 FROM orders o0 JOIN lineitem l0 ON o0.orderkey = l0.orderkey
WHERE o0.custkey = ( SELECT custkey FROM customer WHERE name = '齐光远' ) AND l0.partkey = l.partkey AND o0.custkey != o.custkey ) a
GROUP BY b.custkey
HAVING count( DISTINCT l.partkey ) = ( SELECT count( DISTINCT partkey ) FROM orders o0 JOIN lineitem l0 ON o0.orderkey = l0.orderkey
WHERE o0.custkey = ( SELECT custkey FROM customer WHERE name = '齐光远' ) ) t
WHERE c.custkey = t.custkey )
以上SQL纯手写,没有对应的表结构和数据进行验证,只有题主自行验证了
select
name
from customer c2
where exists
(select
orderkey,custkey
from orders o1
where o1.custkey=c2.custkey
and exists
(select
custkey,name
from
customer c1
where c1.name = '齐光远'
and c1.custkey=o1.custkey))