2010-06-09 76 views
4

我在我的數據庫中有兩個表格,一個用於In,另一個用於Out。他們有兩列,分別是QuantityPrice。我如何編寫一個選擇正確價格的SQL查詢?如何使用SQL管理數據庫中的FIFO隊列?

在例如:如果我有3項 75,然後3項爲80.接着我有兩個 75和第三應爲75(X)而第四個應該是80(Y)。

如何爲X和Y編寫價格查詢?他們應該使用第三和第四行的價格。在例子中,有沒有辦法選擇In -table中的第三行?我不能使用auto_increment作爲「第三」行的標識符,因爲這些表格也會包含其他項目的帖子。這些行不會被刪除,它們將因問責原因而被保存。

SELECT Price FROM In WHERE ...?

數據庫設計:

+----+ 
| In | 
+----+------+-------+ 
| Supply_ID | Price | 
+-----------+-------+ 
|  1  | 75 | 
|  1  | 75 | 
|  1  | 75 | 
|  2  | 80 | 
|  2  | 80 | 
+-----------+-------+ 
+-----+ 
| Out | 
+-----+-------+-------+ 
| Delivery_ID | Price | 
+-------------+-------+ 
|  1  | 75 | 
|  1  | 75 | 
|  2  | X | <- ? 
|  3  | Y | <- ? 
+-------------+-------+ 

OLD數據庫設計:

+----+ 
| In | 
+----+------+----------+-------+ 
| Supply_ID | Quantity | Price | 
+-----------+----------+-------+ 
|  1  | 3  | 75 | 
|  2  | 3  | 80 | 
+-----------+----------+-------+ 

+-----+ 
| Out | 
+-----+-------+----------+-------+ 
| Delivery_ID | Quantity | Price | 
+-------------+----------+-------+ 
|  1  | 2  | 75 | 
|  2  | 1  | X | <- ? 
|  3  | 1  | Y | <- ? 
+-------------+----------+-------+ 
+0

如果Out中的第二行有Quantity = 2,那麼您希望返回什麼? – 2010-06-09 11:29:13

+0

我不認爲這很容易在SQL中完成。如果在第一次「退出」2之後發生了什麼,有人需要2?你不知怎的必須把它分成75個和80箇中的一個,不是嗎? – 2010-06-09 11:30:53

+0

@大衛M:好點。這將是75 + 80 = 155. – Jonas 2010-06-09 11:33:05

回答

4

閱讀您說您願意添加自動增量或日期字段以瞭解每行的正確位置的註釋。一旦你添加了這個,我建議再向In表中添加一行稱爲processed的行,當行被添加到表時,它會自動設置爲false。任何已被複制到OUT的行已將其處理的字段設置爲true。

+----+ 
| In | 
+-----------+-----------+-------+-----------+ 
| AUtoId | Supply_ID | Price | Processed | 
+-----------+-----------+-------+-----------+ 
|  1  |  1  | 75 |  1  | 
|  2  |  1  | 75 |  1  | 
|  3  |  1  | 75 |  0  | 
|  4  |  2  | 80 |  0  | 
|  5  |  2  | 80 |  0  | 
+-----------+-----------+-------+---------- + 

然後尋找下一個項目移動到OUT,你可以做

SELECT TOP 1 Supply_ID, Price 
FROM In WHERE Processed = 0 
ORDER BY [Your Auto Increment Field or Date] 

一旦該行被轉移到OUT,那麼你只更新該行的處理字段設置爲true。

+0

我認爲這將是一個很好的設計。而不是列處理我可以有一個列Delivery_ID,以獲得更好的問責制。謝謝! – Jonas 2010-06-10 11:58:11

0

我看不到一個簡單的查詢,這將有助於在這裏。爲了在SQL中模擬一個FIFO,我會看看三個表,OPERATION,OUT和FIFO。 OPERATION實際上是事務的日誌,FIFO表是FIFO狀態,OUT是來自FIFO的響應。

當它們進入OPERATION表時,您將使用操作(添加和刪除項目)更新CURRENT,並處理項目out的請求到OUT表中,遞減FIFO中的值並在必要時從FIFO中刪除記錄表。

即使那時我沒有看到一個簡單的查詢來處理整個事情,因爲有必要查詢第一條記錄以查看每個操作是否有足夠的數量,適當地更新該記錄並查詢其中的附加記錄該操作無法實現。我的SQL能力水平並沒有讓我對此有一個簡單的解決方案,它構成了我的業務邏輯並被提升到了這一層。