如何使用SQL管理数据库中的FIFO队列?
我的数据库中有两个表,一个用于如何使用SQL管理数据库中的FIFO队列?,sql,database,queue,fifo,inventory,Sql,Database,Queue,Fifo,Inventory,我的数据库中有两个表,一个用于in,另一个用于Out。它们有两列,数量和价格。如何编写选择正确价格的SQL查询 例如:如果我在中有3项用于75,然后在中有3项用于80。然后我有两个out代表75,第三个out代表75(X),第四个out代表80(Y) 如何编写X和Y的价格查询?他们应该使用第三行和第四行的价格。例如,是否有任何方法可以选择-表中的中的第三行?我不能使用auto_increment作为“第三”行的标识符,因为这些表也将包含其他项目的post。这些行不会被删除,它们将因责任原因而保存
in
,另一个用于Out
。它们有两列,数量
和价格
。如何编写选择正确价格的SQL查询
例如:如果我在中有3项用于75,然后在中有3项用于80。然后我有两个out代表75,第三个out代表75(X),第四个out代表80(Y)
如何编写X和Y的价格查询?他们应该使用第三行和第四行的价格。例如,是否有任何方法可以选择-表中的中的第三行?我不能使用auto_increment作为“第三”行的标识符,因为这些表也将包含其他项目的post。这些行不会被删除,它们将因责任原因而保存
从何处选择价格…?
新的数据库设计:
+----+
| In |
+----+------+-------+
| Supply_ID | Price |
+-----------+-------+
| 1 | 75 |
| 1 | 75 |
| 1 | 75 |
| 2 | 80 |
| 2 | 80 |
+-----------+-------+
+-----+
| Out |
+-----+-------+-------+
| Delivery_ID | Price |
+-------------+-------+
| 1 | 75 |
| 1 | 75 |
| 2 | X | <- ?
| 3 | Y | <- ?
+-------------+-------+
+----+
| In |
+----+------+----------+-------+
| Supply_ID | Quantity | Price |
+-----------+----------+-------+
| 1 | 3 | 75 |
| 2 | 3 | 80 |
+-----------+----------+-------+
+-----+
| Out |
+-----+-------+----------+-------+
| Delivery_ID | Quantity | Price |
+-------------+----------+-------+
| 1 | 2 | 75 |
| 2 | 1 | X | <- ?
| 3 | 1 | Y | <- ?
+-------------+----------+-------+
+----+
|在|
+----+------+-------+
|供应|标识|价格|
+-----------+-------+
| 1 | 75 |
| 1 | 75 |
| 1 | 75 |
| 2 | 80 |
| 2 | 80 |
+-----------+-------+
+-----+
|出去|
+-----+-------+-------+
|交货|标识|价格|
+-------------+-------+
| 1 | 75 |
| 1 | 75 |
|2 | X |我看不到一个简单的查询在这里有帮助。为了在SQL中模拟FIFO,我将查看三个表:操作、输出和FIFO。操作实际上是事务日志,FIFO表是FIFO状态,OUT是来自FIFO的响应
当操作(添加和删除项目)进入操作表时,您将使用操作更新当前,并处理项目“输出”进入输出表的请求,减少FIFO中的值,必要时从FIFO表中删除记录
即使这样,我也看不到一个简单的查询来处理整个过程,因为需要查询第一条记录,以查看每个操作是否有足够的数量,适当地更新该记录,并在操作无法完成时查询其他记录。我的SQL能力水平并没有让我找到一个简单的解决方案,它构成了我的业务逻辑,并被提升到这一层。阅读您的评论,您说您愿意添加一个自动递增或日期字段,以了解每行的正确位置。一旦您添加了这一行,我建议您在名为processed的In表中再添加一行,当该行添加到表中时,该行会自动设置为false。已复制到OUT的所有行的已处理字段都已设置为true
+----+
| In |
+-----------+-----------+-------+-----------+
| AUtoId | Supply_ID | Price | Processed |
+-----------+-----------+-------+-----------+
| 1 | 1 | 75 | 1 |
| 2 | 1 | 75 | 1 |
| 3 | 1 | 75 | 0 |
| 4 | 2 | 80 | 0 |
| 5 | 2 | 80 | 0 |
+-----------+-----------+-------+---------- +
然后,要找到下一个要移出的项目,您可以执行以下操作
SELECT TOP 1 Supply_ID, Price
FROM In WHERE Processed = 0
ORDER BY [Your Auto Increment Field or Date]
一旦该行移到OUT,您只需将该行的processed字段更新为true。如果第二行in-OUT的数量为2,您希望返回什么?我认为这在SQL中不容易做到。如果在2个中的第一个“出局”之后,有人还想要2个呢?你得把它分成75个和80个,不是吗?@David M:说得好。75+80=155。你怎么知道前两个不是80?@Paul Tomblin:你说得对。也许我得再考虑一下。也许我必须把它设计成问题的最底层。我认为这将是一个很好的设计。我可以用一个列传递ID来代替处理的列,以获得更好的责任感。谢谢