我正在尝试获取包含特定产品ID但不包含不同产品ID的订单的销售数据条目列表。我需要来自一个表的客户数据和来自另一个表的产品数据(特别是数量)。
'orders'包含客户数据的表格如下所示:
+---------+---------------------------+-----------------+
| OrderID | CustomerName | CustomerAddress |
+---------+---------------------------+-----------------+
| 123 | Joe Smith | 123 wherever st |
| 124 | Jane Doe | 555 Fake Rd |
| 125 | Pete Thompson | 1600 Main St |
+---------+---------------------------+-----------------+
'order_products'表可能如下所示:
+---------+-----------+----------+
| OrderID | ProductID | Quantity |
+---------+-----------+----------+
| 123 | 400 | 1 |
| 123 | 401 | 1 |
| 124 | 400 | 2 |
| 125 | 401 | 1 |
+---------+-----------+----------+
在这个特定的例子中,我希望看到一个结果,只显示包含产品ID 400但不包含401的订单。使用这个假数据,它将是一个单行结果显示:
+---------+--------------+-----------------+----------+
| OrderID | CustomerName | CustomerAddress | Quantity |
+---------+--------------+-----------------+----------+
| 124 | Jane Doe | 555 Fake Rd | 2 |
+---------+--------------+-----------------+----------+
我试过这个:
SELECT o.OrderID, o.CustomerName, o.CustomerAddress, op.Quantity
FROM orders o
LEFT JOIN order_products op
ON o.orders_id = op.orders_id
WHERE op.ProductID = 400
AND op.ProductID != 401
但即使它包含ProductID 401,我仍然会返回订单号123.我理解为什么(因为order_products包含每个产品的一行)但我不知道还有什么可以尝试。
答案 0 :(得分:2)
使用NOT EXISTS
:
SELECT o.OrderID, o.CustomerName, o.CustomerAddress, op.Quantity
FROM orders o
LEFT JOIN order_products op
ON o.orders_id = op.orders_id
WHERE op.ProductID = 400 AND
NOT EXISTS (SELECT 1
FROM order_products AS op2
WHERE op2.orders_id = o.orders_id AND op2.ProductID = 401)
这将排除与orders
的{{1}}记录相关的order_products
条记录。