2012-03-19 34 views
0

は、SQLの選択クエリのヘルプ/ガイドが必要です。在庫が2つあり、在庫は在庫のの初期値を持ち、在庫表を更新する前に在庫表から1番目に挿入されます。私の場合はこれがオープン在庫残高と近い在庫残高を追跡することである 、選択日付に基づいて株式のステータスを取得する必要があるだけで、特定のタイムスタンプのためのテーブルの株式 からデータをフェッチする必要がある場合には、近い在庫残高が簡単であるが、重要な部分特定のタイムスタンプのステータスを追跡する必要がオープン在庫残高、 のためのデータをフェッチするとき、これが唯一の履歴表を参照のうえによって行うことができるので、私は株式とstock_historyselectステートメントのsqlクエリ

の両方からのデータを選択する必要があり、SQLを必要としています

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

私はあなたのスキーマを再構築をお勧めしたい、言った:

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演算子を使用することができ感謝を助けてください。別の「在庫」と「在庫履歴」テーブルを持つ理由あなたは本当に両方を保存するために1つの "在庫"テーブルが必要です - 現在の在庫は最も高いステータスを持つものだけです。あるいは、明示的に "is_current"フラグ行を維持することもできます。

更新日:UNIONからUNION ALLに変更されました。 ALL手段は、単に両方のテーブル、余分な処理のために行を兼ね備えています。それを放置すると効率が悪くなる可能性があり、最初の任意の重複行を削除しよう(と重複が自分のスキーマでは不可能なので、ここでの結果での違いはありません)します。 @SmartestVEGAへのHat tip

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

も機能します!

+0

'ALL'だけ重複することができます。このスキーマが与えられているので、それらは可能ではないので、ここで私の答えと異なる何もしません。 –

+1

@BenLee:「*それは*異なる何もしない」 - 離れて高速化されてから;) –

+0

トウシュ。あなたは新しい答えの代わりに私の答えにコメントとしてそれを掲示できませんでしたか?増加した効率を考慮して私の答えを更新したいと思います。 –