这里的新手使用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的子查询?
谢谢!
答案 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”,从而在整体结果中包括该客户。
由于只需要客户列表,因此无需将订单表加入主查询。