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 フィドルのデモ

于 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 に答える