2012-03-19 189 views
0

需要help/guide for sql select查詢,我有2個表股和stock_history,股票將有股票 和更新股票表之前的初始值,stock_history會從股票表中插入1st,我的情況是需要根據選擇日期獲取庫存狀態, 這是爲了跟蹤未平倉的庫存餘額和平倉庫存餘額,只需要從表庫 中獲取特定時間戳的數據,庫存平衡很容易,但是關鍵部分是什麼時候獲取開放股票餘額的數據,需要跟蹤特定時間戳的狀態,這隻能通過引用歷史表來完成,所以我需要sql需要從股票和stock_history中選擇數據sql查詢select語句

status table 
id desc 
-- ---- 
01 consignment 
02 customer 
03 bank 
04 safekeep 
05 exit 

stock 
----- 
ref_no serial_no  status timeStamp 
1  001   04  2012-03-01 09:03:00 

stock_history 
------------- 
ref_no serial_no status timeStamp 
1  001  01  2012-03-01 09:00:00 
1  001  03  2012-03-01 09:01:00 
1  001  02  2012-03-01 09:02:00 

so, when choose for date 
01/03/12 time 9:01 = 1 001 03 2012-03-01 09:01:00 
01/03/12 time 9:01 = 1 001 03 2012-03-01 09:01:00 

請幫助,在此先感謝

回答

3

您可以使用UNION運算符來從多個表中選擇:

SELECT * FROM stock 
UNION ALL 
SELECT * FROM stock_history 
WHERE ... 

這麼說,我會建議重組架構。爲什麼要有一個單獨的「股票」和「stock_history」表?你真的只需要一個「股票」表來存儲兩者 - 「當前」股票只是最高狀態的股票。或者你甚至可以明確並保持「is_current」標誌行。

更新:將UNION更改爲UNION ALLALL意味着將兩個表的行組合起來,不需要額外的處理。離開它將首先嚐試刪除任何重複的行,這可能效率較低(並且結果沒有差異,因爲重複對於您的模式是不可能的)。 Hat tip到@SmartestVEGA。

2
SELECT * FROM stock 
UNION ALL 
SELECT * FROM stock_history 
WHERE ... 

也適用!

+0

'ALL'只允許重複。由於在這種模式下它們是不可能的,所以它在這裏不會做任何不同的事情,而不是我的答案離開它。 – 2012-03-19 08:43:28

+1

@BenLee:「*它沒有做任何不同的事*」 - 除了更快;) – 2012-03-19 08:50:01

+0

touche。但難道你不能把它作爲我的答案的評論而不是新的答案嗎?我想更新我的答案,以提高效率。 – 2012-03-19 08:52:11