0

我有一个跟踪库存位置的数据库。

该应用程序编写得很糟糕,并且是一团乱七八糟的意大利面条代码,没有 MVC 分离,并且模型的更新可以发生在任意数量的文件中。

首次编写应用程序时,它只需要跟踪库存当前所在的位置,因此库存表中存在一个 SiteID 列,该列列出了它当前分配到的位置。

从那时起,所有者决定他想要维护库存分配到哪些位置的历史记录。我没有遍历所有代码来尝试查找它可能更新的所有位置,而是添加了一个触发器ON UPDATE,并将其添加ON INSERT到在历史表中记录移动的库存表。

最初的要求是能够查看库存的移动历史,这很容易解决SELECT * FROM history WHERE InvID = X ORDER BY timestamp DESC

现在,我被要求为给定位置生成一个列表,该列表显示何时将一段库存分配给该站点,以及它离开的日期(下面的示例)。理想情况下,如果可能的话,我想在不修改现有架构和触发器的情况下实现这一点。

我能够检索一次分配给站点的所有库存的列表以及分配日期。我正在努力解决的是如何找到该库存离开网站的日期。我可以在应用程序中执行此操作,但我想知道是否可以使用 SQL。

库存表

InventoryID     InventoryName    SiteID
===========     =============    ======
          1     Widget A         $ID
          2     Widget B         $ID
          3     Widget C         $ID

位置表

SiteID    SiteName
======    ========
     1    Somewhere
     2    Nowhere
     3    Anywhere

历史表

InvID    SiteID    Timestamp
=====    ======    =========
    1         1    2012-01-01
    1         2    2012-01-02
    2         1    2012-01-03
    1         1    2012-01-04

新视图应该是这样的

InvID    DateIn        DateOut
=====    ==========    ==========
    1    2012-01-01    2012-01-02
    2    2012-01-03    NULL
    1    2012-01-04    NULL   

使用编程语言生成表的伪代码(后处理 SQL 查询

SELECT * FROM history WHERE SiteID = 1

foreach (row in result) {
    DateOut = SELECT * FROM history WHERE InvID = result.InvID AND timestamp > result.timestamp LIMIT 1
}
4

2 回答 2

1

试试这个:

它只是可能与左外连接到同一个表并从右表中获取最小日期

select H1.InvID,I.InventoryName,H1.SiteID,H1.[Timestamp] [date in],
MIN(H2.[Timestamp]) [date out] 
from    History H1 left outer join History H2
on      H1.InvID=H2.InvID and H1.[Timestamp]<H2.[Timestamp]
join Inventory I on I.InventoryID= H1.InvID
where   H1.SiteID=1
group by    H1.InvID,I.InventoryName,H1.SiteID,H1.[Timestamp]

Sql Fiddle 演示

于 2012-07-25T06:52:06.860 回答
0

您可以使用子查询来查找库存项目位于不同站点的第一个日期:

select  h1.InvID
,       h1.Timestamp as DateIn
,       (
        select  min(TimeStamp)
        from    history h2
        where   h2.InvID = h1.InvID
                and h2.SiteID <> h1.SiteID
                and h2.TimeStamp > h1.TimeStamp
        ) as DateOut
from    history h1
where   h1.SiteID = X 
于 2012-07-25T06:52:39.230 回答