2014-01-15 90 views
4

我需要創建一個表上的數據進行操作,它已經提供給我這個樣子:我應該如何設計我的表

col1 col2  col3 
1  < 3   50% 
2  < 5   50% 
3  < 10  50% 
1  5>RC >=3 25% 
2  10>RC >=5 25% 
3  20>RC >=10 25% 
1  >=5   0% 
2  >=10  0% 
3  >=20  0% 

該系統的用戶將被傳遞一個數字,這是目前在col2col1之上。假設用戶爲col2傳遞了7,爲col1傳遞了1。業務要求是,我應該回報用戶後面的行

1  >=5   0% 

粗略地說,這意味着我在col2檢查值,並注意到這是>=5,其中我的輸入數據相符。

我想劃分col2橫跨兩列 - 一個用於存儲數字,另一個用於運算符。事情是這樣的:

col1 col2  col3 col4 
1  3   50%  < 
2  5   50%  < 
3  10   50%  < 
1  5>RC >=3 25% 
2  10>RC >=5 25% 
3  20>RC >=10 25% 
1  5   0%  >= 
2  10   0%  >= 
3  20   0%  >= 

Thsi方式,我將能夠寫出解決基於第一個和最後三列數據的查詢查詢(雖然我沒有運行的查詢現在,我只是做了試運行)。我目前無法弄清的是 - 如何解決第4,5,6行中的數據?您可以忽略這些行中的RC部分,因爲我可以放棄它,因爲我關心的是我的查詢的數字範圍。

我試圖拆分數據行4,5,6各2行,是這樣的:

1  3   25%  >= 
1  5   25%  < 
2  5   25%  >= 
2  10   25%  < 
3  10   25%  >= 
3  20   25%  < 

但是,我在這裏看到一個迫在眉睫的問題,當談到檢索數據。假設用戶參與col2 = 7 AND col1 = 1。現在,我應該只有一行,這是我的問題的第一個表中的第7行,但我也得到了一個額外的行(最後一個表中的第一行,我正在爲BETWEEN條件拆分數據)

任何人都可以建議我一個更好的方法來存儲這些數據,以便我的要求可以實現嗎?

SQLFiddle演示:http://www.sqlfiddle.com/#!4/d2d90/7

回答

1

我建議,你應該只拆分COL2兩列 - 較低和較高的束縛,更換不存在約束,例如,用NULL。它會是這個樣子:

+----+-------+-------+----+ 
|col1|col2_lb|col2_hb|col3| 
+----+-------+-------+----+ 
|1 |NULL |3  |50% | 
+----+-------+-------+----+ 
|2 |NULL |5  |50% | 
+----+-------+-------+----+ 
|3 |NULL |10  |50% | 
+----+-------+-------+----+ 
|1 |3  |5  |25% | 
+----+-------+-------+----+ 
|... |... |... |... | 
+----+-------+-------+----+ 
|1 |5  |NULL |0% | 
+----+-------+-------+----+ 

採用這種結構,你就可以找到所需要一行簡單的查詢:

SELECT * 
FROM T_TABLE t 
WHERE t.col1 = :VAL1 
     AND NVL(t.col2_lb,:VAL2) <= :VAL2 
     AND NVL(t.col2_hb,:VAL2+1) > :VAL2 
+0

感謝@Mikhail我已經嘗試這種方法拆分數據到單獨的列,但由於我在查詢中犯了一個簡單的錯誤,我被卡住了。您的查詢向我顯示,並且現在按預期工作!非常感謝! – Incognito