我有一个跟踪库存位置的数据库。
该应用程序编写得很糟糕,并且是一团乱七八糟的意大利面条代码,没有 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
}