代码之家  ›  专栏  ›  技术社区  ›  Jonas

如何使用SQL管理数据库中的FIFO队列?

  •  4
  • Jonas  · 技术社区  · 15 年前

    我的数据库中有两个表,一个用于 In 一个 Out . 它们有两列, Quantity Price . 如何编写选择正确价格的SQL查询?

    例如:如果我有3个项目 在里面 75件,然后3件 在里面 80。然后我有两个 外面的 75元,第三个 外面的 应该是75(x)和第四个 外面的 应为80(y)。

    如何编写x和y的价格查询? 他们应该使用第三排和第四排的价格。例如,是否可以选择 -桌子?我不能使用自动增量作为“第三”行的标识符,因为表中也将包含其他项目的日志。这些行将不会被删除,它们将出于责任原因被保存。

    SELECT Price FROM In WHERE ...?

    新的 数据库设计:

    +----+
    | 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   | <- ?
    +-------------+----------+-------+
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Waleed Al-Balooshi    15 年前

    阅读您所说的注释,您愿意添加一个自动递增或日期字段,以了解每行的正确位置。一旦您添加了这一行,我建议您再向名为processed的in表中添加一行,该行在添加到表中时自动设置为false。已复制到外部的任何行的已处理文件都已设置为“真”。

    +----+
    | 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]
    

    一旦将该行移出,则只需将该行的已处理字段更新为“真”。

        2
  •  0
  •   Lazarus    15 年前

    我看不出一个简单的查询对这里有帮助。为了在SQL中模拟FIFO,我将查找三个表:operation、out和FIFO。操作实际上是事务日志,FIFO表是FIFO状态,输出是FIFO的响应。

    当操作(添加和删除项)进入操作表时,您将使用操作(添加和删除项)更新当前值,并将项目“out”的请求处理到输出表中,从而减少FIFO中的值,并在必要时从FIFO表中删除记录。

    即使这样,我也不认为简单的查询可以处理整个过程,因为需要查询第一条记录,以查看每个操作是否有足够的数量,适当地更新该记录,以及查询无法完成操作的其他记录。我的SQL能力水平并没有引导我找到一个简单的解决方案,它构成了我的业务逻辑,并提升到了这一层。