2012-07-25 100 views
0

我有一個跟蹤庫存位置的數據庫。帶有日期計算的SQL視圖

該應用程序寫得很差,並且是沒有MVC分離的意大利麪條代碼的混亂,並且可以在任何數量的文件中更新模型。

首次編寫應用程序時,只需跟蹤庫存當前所在的位置,因此庫存表中存在一個列出當前分配給的SiteID列。

從那時起,業主已決定他想保留庫存分配到哪些位置的歷史記錄。不是遍歷所有的代碼來試圖找到它可能更新的所有地方,而是將一個觸發器ON UPDATEON 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 
} 

回答

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 demo

+0

工作就像一個魅力!謝謝:) – mcourtney 2012-07-25 07:20:53

+0

是否有可能擴大這個在結果中包括庫存名稱? InvID InvName DateIn DateOut ======= ========== ========== 1 Widget A 2012-01-01 2012- 01-02 2小工具B 2012-01-03 NULL 1小工具A 2012-01-04 NULL – mcourtney 2012-07-25 07:29:37

+1

@mcourtney:非常有可能。我更新了我的查詢。請檢查它 – 2012-07-25 07:38:19

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

這似乎有一個錯誤。對於只有一個歷史記錄(即初始分配)的清單,仍然會列出DateOut(預期結果爲NULL) – mcourtney 2012-07-25 07:16:16