使用NOT运算符的带有子查询的SQL查询

时间:2019-06-10 00:22:38

标签: sql

这里的新手使用W3schools demo database来练习SQL查询,我被困在其中:

SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, OrderDetails.ProductID, Products.ProductName FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
INNER JOIN OrderDetails ON OrderDetails.OrderID = Orders.OrderID
INNER JOIN Products ON Products.ProductID = OrderDetails.ProductID
WHERE OrderDetails.ProductID <> 70

我想查看已下订单但尚未订购产品ID 70的客户列表。

此查询仍显示已订购产品ID 70的客户的其他订单。如果客户已订购产品,则我不想在此列表中看到他们的其他任何订单。这种情况是否需要使用WHERE EXISTS的子查询?

谢谢!

3 个答案:

答案 0 :(得分:1)

听起来您只是在寻找NOT关键字:

SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, OrderDetails.ProductID, Products.ProductName FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
INNER JOIN OrderDetails ON OrderDetails.OrderID = Orders.OrderID
INNER JOIN Products ON Products.ProductID = OrderDetails.ProductID
WHERE NOT OrderDetails.ProductID = 70

答案 1 :(得分:1)

使用聚合:

SELECT c.CustomerID, c.CustomerName
FROM Customers c JOIN
     Orders o
     ON c.CustomerID = o.CustomerID JOIN
     OrderDetails od
     ON od.OrderID = o.OrderID
GROUP BY c.CustomerID, c.CustomerName
HAVING SUM(CASE WHEN od.ProductID = 70 THEN 1 ELSE 0 END) = 0;

这是一个与询问哪个订单有产品70的问题不同的问题。只需查看一行以查看产品是否存在,就可以回答该问题。但是,要确定产品70是否为任何顺序,您需要查看所有产品,这就是为什么需要汇总的原因。

答案 2 :(得分:1)

您确实可以为此使用NOT EXSISTS查询:

{{1}}

子查询测试每个客户是否至少有一个订单的productid = 70。如果不存在这样的订单,则NOT EXISTS将得出“ true”,从而在整体结果中包括该客户。

由于只需要客户列表,因此无需将订单表加入主查询。