以下是一个示例查询:
SELECT customerName from customers
WHERE customerNUMBER IN
( SELECT customerNumber FROM orders
WHERE orderNumber
IN ( SELECT orderNumber FROM orderdetails
INNER JOIN products on orderdetails.productCode = products.productCode
where products.buyPrice > 100 ));
我相信这些表格是不言自明的。
有更好的方法吗?
SQL noob here。
答案 0 :(得分:13)
我的建议是将其更改为JOIN语法而不是所有WHERE / IN子句过滤:
select c.customerName
from customer c
inner join orders o
on c.customerNumber = o.customerNumber
inner join orderdetails od
on o.orderNumber = od.orderNumber
inner join products p
on od.productCode = p.productCode
where p.buyPrice > 100;
如果需要,您可能必须在有重复项的情况下向查询添加DISTINCT。
答案 1 :(得分:8)
在整个过程中使用普通的内部联接,如果需要消除重复,则使用或者使用不同的子句抛出:
select customers.*
from customers
join orders on ...
join orderdetails on ...
join products on ...
group by customers.customerNumber
答案 2 :(得分:2)
EXISTS
允许您组合所有子查询部分。重复不是问题:
customers
表在外部查询中可见EXISTS
为每个customers
行生成一个布尔结果:-
SELECT customerName from customers cc
WHERE EXISTS (
SELECT *
FROM orders oo
JOIN orderdetails od ON od.orderNumber = oo.orderNumber
JOIN products pr ON od.productCode = pr.productCode
WHERE oo.customerNUMBER = cc.customerNumber
AND pr.buyPrice > 100
);