在庫の場所を追跡するデータベースがあります。
アプリケーションの記述が不十分で、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
}