日期:2014-05-18  浏览次数:20596 次

请教个数据库设计和数据规则问题
有一组数据规则,H=6对应的H1数据是H1=3.5,H=7对应的H1数据是H1=6,H=8对应的H1数据是2.5。
根据H的值,更新H1的值
一种方法是条件判断update   表1
set   h1=case   when   H   =   6     then   3.5
                        when   H   =7   6   then   6
                        when   H=8   then   2.5
              end
第二种方法建一个数据对照表   表2
H           H1                                               update   表1
6           3.5                                             set   表.h1=表2.h1    
7           6                                                 FROM   表1   INNER   JOIN
8           2.5                                             表2   ON   表1.H   =   表2.H
用哪一种方法好呢,
第一种当条件比较负责的时候比如要判断大于,小于的时候会方便一点

第二种数据对照关系改变的时候直接修改数据库就可以,不用再改语句或程序,可是如果判断条件复杂的话,第二种表应该怎么建呢,比如有大于小于的情况和有权重的情况,比如H=6或5,H1=3.5   ;3 <H <6=4这种情况呢
希望有数据库设计或程序设计方面的高手给我指点一下;


------解决方案--------------------
对照表这样建

最小值,是否含最小值, 最大值 ,是否含最大值 ,对应的值


这样复杂的条件也可以用join来update

------解决方案--------------------
--如果阶段连续,只用最大值就可以了。以下是例子
declare @t1 table(h int ,h1 int)
insert @t1 --(h,h1)
select 2,1 union all
select 4,2 union all
select 6,3

declare @t2 table(h int )
insert @t2 (h)
select 1 union all
select 2 union all
select 3 union all
select 4 union all
select 5 union all
select 6
select * from @t1
select * from @t2
--下面这个改成view
select a.h,min(b.h1) h1 from @t2 a left outer join @t1 b on a.h <=b.h group by a.h
------解决方案--------------------
update t
from t.要更新的值 = d.对应的值
join 对照表 d
on (d.是否含最小值 = 0 and t.关联的值 > d.最小值 or d.是否含最小值 = 1 and t.关联的值 > = d.最小值)
and (d.是否含最大值 = 0 and t.关联的值 < d.最大值 or d.是否含最大值 = 1 and t.关联的值 <= d.最大值)



------解决方案--------------------
--如果阶段不连续 h= 0,1,2 h1没有值,h=3,4,5,6,h1=4;h=7 h1=88;h=8,h1=99
declare @t1 table(h int ,h1 int)
insert @t1
select 2,null union all
select 6,4 union all
select 7,88 union all
select 8,99