如何避免链接SQL中的WHERE .. IN语句?

时间:2013-05-01 16:27:10

标签: sql

以下是一个示例查询:

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。

3 个答案:

答案 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 
        );