日期:2014-05-17  浏览次数:20655 次

说的不够详细...我再来一次!!在线等~~~~~~~~
是这样的..我现在有三个表,第一个是用来保存某种业务的参数表,如出租房屋这种业务,有面积等等的参数.可以由用户自己增加或删除,第二个表用来记录登记的一些信息,如张三来登记出租房屋,第三个表是用来保存登记的具体信息,如登记了出租房屋,那么就从第一个表里查出参数的个数及名称..然后再一一保存进第三个表!!!问题来了...我现在要对第三个表做多条件查询...如面积>=100或 朝向为南等,这下麻烦了,用SQL字符串拼接没问题.但是参数类型全是STRING类型,不知道该如何来做了....是不是我的数据表设计错了?我刚学VB跟数据库,只懂少少,麻烦各位给点建议啦!!谢谢
tb_agParam:
id(自动编号) pid(文本) bname(文本) pname(文本)
1 cs001 出租房屋 面积
2 cs002 出租房屋 地址
3 cs003 出租房屋 楼层
4 cs004 出租房屋 朝向


tb_register:
id(自动编号) rid(文本) bname(文本) cname(文本) rdate(时间/日期)
1 jl0001 出租房屋 张三 2008-03-22
2 jl0002 求租房屋 李四 2008-03-22

tb_content:
id(自动编号) rid(文本) pname(文本) ptype(文本)
1 jl0001 面积 100
2 jl0001 地址 佛山
3 jl0001 楼层 3
4 jl0001 朝向 南

------解决方案--------------------
提供这么大的灵活给用户?你自己定死有几项就行了,其它你可以开个memo,然用户自己输入。
不然我搞个上百项在里面都可以,装修材质、牌子、马桶型号、地板砖尺寸。。。晕死你。
------解决方案--------------------
我上午就说过他的设计有问题了.
------解决方案--------------------
这样设计灵活性很好,数据也不冗余,但就是查询有点费事,不过也是有办法的,就像你说的拼接SQL。
对于表b_agParam建议多加一个字段,来标记属性的类型,到时候查询就可以用convert或者cast来处理了。

------解决方案--------------------
你的数据库有严重问题,数据库元素的基本原则之一就是,每个元素不可再分。
tb_agParam: 
id(自动编号) pid(文本) bname(文本) pname(文本) 
这个可以更改成
tb_agParam: 
id(自动编号) pid(文本) bname(分类) pname(文本) 
否则就没的玩了。
本来想帮你了,但是解决了这个,解决不了所有的。
建议更改数据库结构了。
------解决方案--------------------
首先尽量简化你的数据库设计,尽量减少冗余数据和不必要的拆分.
其次,关于多表的模糊查询,写个存储过程,动态执行T-SQL即可.
http://topic.csdn.net/u/20080322/10/3ca74d95-9ef5-44d6-ad4b-44149c6fdaec.html
------解决方案--------------------
引用楼主 akissofbye 的帖子:
是这样的..我现在有三个表,第一个是用来保存某种业务的参数表,如出租房屋这种业务,有面积等等的参数.可以由用户自己增加或删除,第二个表用来记录登记的一些信息,如张三来登记出租房屋,第三个表是用来保存登记的具体信息,如登记了出租房屋,那么就从第一个表里查出参数的个数及名称..然后再一一保存进第三个表!!!问题来了...我现在要对第三个表做多条件查询...如面积>=100或 朝向为南等,这下麻烦了,用SQL字符串拼接没问题.但是参数…

------解决方案--------------------
SQL code
select * from tb_register a where 
exists (select 1 from tb_content where a.rid = rid 
and pname ='面积' and ptype >=100)--sql会自动类型转换。
and 
exists (select 1 from tb_content where a.rid = rid 
and pname ='朝向' and ptype = '南')

------解决方案--------------------
这样更明白些,容易理解。
SQL code
declare @v varchar(10)
select @v = '40'
select * from (
select 1 id,'字符串比较40<5' sm,case when @v>  '5' then @v else 5   end as v union
select 2,'数字比较40>5'        ,case when @v>   5  then @v else 5   end      union
select 3,'字符串比较40>300'    ,case when @v>'300' then @v else 300 end      union
select 4,'数字比较40 <300'     ,case when @v> 300  then @v else 300 end 
) a order by id
/*
id          sm               v           
----------- ---------------- ----------- 
1           字符串比较40<5        5
2           数字比较40>5         40
3           字符串比较40>300      40
4           数字比较40 <300      300
*/