我应该如何设计我的桌子

时间:2014-01-15 09:48:31

标签: sql oracle oracle11g

我需要创建一个用于操作数据的表,这个表已经提供给我:

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%      >=

通过这种方式,我将能够根据第一列和最后三列中的数据编写查询以解决查询问题(尽管我现在还没有运行查询,我只是干运行)。到目前为止我无法弄清楚的是 - 如何处理第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在我的问题第一个表,但我也得到一个额外的行(第1行中的最后一个表,在那里我是分割数据BETWEEN条件)

有人能建议我更好地存储这些数据,以便实现我的需求吗?

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

1 个答案:

答案 0 :(得分: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