【发布时间】:2017-07-13 15:12:41
【问题描述】:
我是 SQL 新手,我需要编写一个查询来返回可以用库存中的物品完成的订单列表。
假设下表显示了订单和完成订单所需的物品。
------------------------------
| OrderID | Required Item No |
------------------------------
| ORD001 | Item007 |
| ORD001 | Item008 |
| ORD001 | Item009 |
| ORD002 | Item008 |
| ORD002 | Item009 |
| ORD002 | Item012 |
| ORD003 | Item008 |
| ORD003 | Item014 |
所以为了得到满足,
- ORD001 需要 Item007,Item008,Item009
- ORD002 需要 Item008,Item009,Item012
- ORD003 需要 Item008,Item014
让我们假设这张表是显示我的库存
--------------------------
| Item Unique Id |Item No |
--------------------------
| 001 | Item007|
| 002 | Item008|
| 003 | Item008|
| 004 | Item012|
| 005 | Item009|
| 006 | Item014|
| 007 | Item015|
在这种情况下,查询应该返回 ORD001 和 ORD003。有人可以帮我解决这个问题吗?
我的第一次尝试
以下查询返回我的库存
SELECT ItemNo, COUNT(ItemNo) AS QTY
FROM InventoryTable
GROUP BY ItemNo
------------------------------
| ItemNo | QTY |
------------------------------
| Item007| 1 |
| Item008| 2 |
| Item009| 1 |
| Item012| 1 |
| Item014| 1 |
| Item015| 1 |
此查询返回特定订单所需物品的列表
SELECT ItemNo, COUNT(ItemNo) AS QTY
FROM OrdersTable
Where OrderID ='ORD003'
Group By ReqItemNo
------------------------------
| ItemNo | QTY |
------------------------------
| Item008 | 1 |
| Item0014| 1 |
我找不到在这两个表之间减去项目数量并为每个订单进行减法并返回可用订单的方法。
感谢@Gordon Linoff 的建议
select t1.OrderID
from t1
left join inventory i
on t.required_item_no = i.item_no
group by t1.OrderId
having count(*) = count(i.item_no)
这个查询看起来是正确的,但是它返回了上面例子的 ORD001,ORD002,ORD003。当 Item009 被分配给 ORD001 时,因为不再有 Item009,所以查询不应该满足 ORD002。
【问题讨论】: