Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL管理数据库中的FIFO队列?_Sql_Database_Queue_Fifo_Inventory - Fatal编程技术网

如何使用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来代替处理的列,以获得更好的责任感。谢谢