假设我们有一个如下所示的表
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个连接器#6s,它可以作为连接器#4和#5工作。
connection_requirements表连接到items表,我们如何过滤需要比可用的连接更多的项?我们已经有了代码来过滤那些需要不可用连接器的项目。
这个问题有更多的复杂性,所以我们试图简化问题。
非常感谢大家的帮助!
发布于 2011-06-09 02:29:25
一种方法是确定物品的“真实”库存,包括它们的替代品。例如,part 4的实际库存实际上是5: 1-part #4 + 4-part #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连接器的要求,您没有足够的部件。要解决此问题,您可能必须使用循环或多个查询,这些查询将在您用完所有主要部件后确定现有库存。
https://stackoverflow.com/questions/6283200
复制相似问题