有5个条件 A,B,C,D,E
A,B之间有父子关系,
C,D之间有父子关系。
A,B,C,D,E展现给用户的是5个下拉列表,根据A选择项,加载B;根据C选择项加载D。
每个条件的第一项为所有。若在数据维护时,该选项是所有,查询要求根据子项可以查出按所有维护的基础数据。
例如:数据维护时选择的是
A5,A5-B3,C4,C4-D23,E50,
数据库保存的是对应的代码,假如是
id   key           A    B    C   D   E    valid
1    S20100510-01  10   20   13  15  23   1但维护时如果其中有一项或多项为所有,我想到的方法有两种:
方法1是,如果有项目维护为所有,就把维护为所有的项目进行笛卡尔积进行保存。
这种方法数据在更新时需要调整的数据比较多。
方法2是,如果有项目维护为所有,在保存时先检测是有子项已经维护,如果有进行覆盖。
所有项保存-1,以示标志。
对于上面的实例如果第二次维护时选择的是
所有,所有,C4,所有,E50
数据库保存的是
id   key           A    B    C   D   E    valid
1    S20100510-01  10   20   13  15  23   0
2    S20100510-02  -1   -1   13  -1  23   1现在根据具体项进行查询,直接匹配查询失败,需要放大条件。即把部分选项设为-1,去匹配。
这种试探方式,需要进行很多次。在sql进行判断放大,有很大的代码重复。向高手请教,有没有好方法实现上面的逻辑~~~~白天不能上CSDN,晚上回来结贴。

解决方案 »

  1.   

    id,key 和vaild是什么意思啊,为什第一次时vaild=1而第二次就是0了还有A B C D E是不是已有的表,然后需要根据选择生成数据这个出来的是不就是你说的笛卡尔
    select a.code a,b.code b,c.code c,d.code d,e.code e from
    (select code from A where a.value=@value1 or @value1='所有') a,
    (select code from B where b.value=@value2 or @value2='所有') b,
    (select code from C where c.value=@value3 or @value3='所有') c,
    (select code from D where d.value=@value4 or @value4='所有') d,
    (select code from E where e.value=@value5 or @value5='所有') e
    再就是如果以-1代表所有,那为什么还是两条数据
      

  2.   

    分写多个存储过程,然后在下拉列表的selectedchange事件中调用带关联关系的存储过程就可以了吧.