假设我们有一个看起来像这样的表
connection_requirements
+-----------------------------------+
| item_id | connector_id | quantity |
+---------+--------------+----------+
| 1 | 4 | 1 |
| 1 | 5 | 1 |
| 1 | 2 | 2 |
+---------+--------------+----------+
此表是电子设备操作所需的连接器列表,以及所需的每种连接器的数量。 (想想主板上的连接需要某种类型的电源连接器)
现在我们也有这张桌子......
connections_compatability
+-------------------------+
| connector_id | works_as |
+--------------+----------+
| 6 | 4 |
| 6 | 5 |
+--------------+----------+
第一列是连接器,也可以充当第二列的连接器ID。 (例如,电源具有“6 + 2引脚”等连接器,可用作“8引脚”或“6引脚”)
现在最后我们知道这个表中有多少个连接器可用
connector_quantities
+-------------------------+
| connector_id | quantity |
+--------------+----------+
| 1 | 1 |
| 2 | 3 |
| 3 | 2 |
| 4 | 1 |
| 5 | 0 |
| 6 | 4 |
| 7 | 0 |
| 8 | 5 |
+--------------+----------+
根据这些表格,正如您所推断的那样,我们确实有足够的连接器用于项目编号1以正确操作。即使我们没有足够的连接器#5,我们也有4个连接器#6,它们可以用作连接器#4和#5。
connection_requirements表连接到items表,我们如何过滤需要比我们可用的更多连接的项目?我们已经有代码来过滤需要不可用连接器的项目。
这个问题有更复杂的层次,所以我们试图简化问题。
非常感谢所有人的帮助!
答案 0 :(得分:0)
一种方法是确定项目的“真实”库存,包括其替换。例如,第4部分的实际库存实际上是5:1部分#4 + 4部分#6。所以使用它:
Select ...
From connection_requirements As CR
Where Not Exists (
Select 1
From connector_quantities As Q1
Left Join (
Select C2.connector_id, C2.works_as, Q2.quantity
From connections_compatibility As C2
Join connector_quantities As Q2
On Q2.connector_id = C2.connector_id
) As Subs1
On Subs1.works_as = Q1.connector_id
Where Q1.connector_id = CR.connector_id
And ( Coalesce(Subs1.quantity, 0) + Q1.quantity ) > CR.quantity
)
这种方法当然有一个问题。假设您有一个化妆品为4 #4 connectors and 2 #6 connectors
的物品。从技术上讲,你有4#4连接器(1#4和3#6替换),但结合2#6连接器的要求,你没有足够的部件。要解决此问题,您可能必须使用循环或多个查询,这将在您用完所有主要部件后确定现有库存。