strsql=" select 危险性 from A where 动物='"& text1.text &"'" if rs.stateclosed then rs.close rs.open strsql,conn,adopenkeyset,adlockreadonly if rs.recordcount>0 then msgbox text1.text & space(2) & rs!危险性 &"" else msgbox text1.text & space(2) & "安全" end if rs.close
能否用一个Sql语句搞定,以方便进行复杂的关联,vb代码不合要求。
如果是这样,没有关联表,直接用SQL语句的思路可以: select count(动物) as c from tb where 动物='猫' 然后在程序中判断,c返回0,就是安全...
t_animal ID 动物 危险 1 熊 1 2 虎 1 3 蛇 1 4 猫 0rs.open " select * from t_animal where 危险 = 1 " if rs.recordcount = 0 then msgbox "丫是安全的!"PS:不高效..
加个函数,SQL数据库用case,ACCESS用iif:select (case when count(动物)=0 then '安全' else 危险 end) as 危险性 from tb where 动物='猫'
select (case when count(动物)=0 then '安全' else '危险' end) as 危险性 from tb where 动物='猫'
呵呵,我在VBMAN的基础上改一点:select 动物, (case when count(动物)=0 then '安全' else '危险' end) as 安全性 from tb where 动物='猫'
有一个叫运价的表!有很多字段,如安全性类别,目的站类别,代理类别等,在实际运用中,每个字段都要别的表中查。比如代理类别,查类别表(没查到就是普通代理); 安全性类别,就查危险性表(没查到就是安全); 目的站类别,就查目的站表,没查到就是实际目的站,查到了就是特殊组名,本来直接将这样表关联起来,就可以用 where 安全性类别='安全',代理类别='普通',目的站类别='云南组' 这样的sql语句查到运价了。(可能有多条可用值) 问题在于 1、结构要求未查到的数据给一个默认值,有的就是数据本身,有的是固定的,这怎么处理啊! 2、不用关联很难处理,因为有些表的查询都可以给出多个值。用一个七重循环查无数次Sql不现实的说,而且最后还要给出可用运价条目列表,难道还要一一合并?
13楼的语句在access中不行,(已改为iif),
原来你用ACCESS啊,HAND,俺天天用它呢。
据说ACCESS里只有参数查询,没有存储过程。
strsql=" select 危险性 from A where 动物='"& text1.text &"'" if rs.stateclosed then rs.close rs.open strsql,conn,adopenkeyset,adlockreadonly if rs.recordcount>0 then msgbox text1.text & space(2) & rs!危险性 &"" else msgbox text1.text & space(2) & "安全" end if rs.close 这个怎么不符合要求了? 挺好的阿
恩,先说句你不爱听的哈。我觉得你的需求其实可能也许或者maybe and perhaps是没必要滴。其实,你计算运价的话,不需要一个SQL搞定。我就是分头从7个表里得到相应的数据,然后根据一定的公式算出运价,有什么不可以么?用户查运价也不可能一下子输入一大堆查询吧?毕竟用户要把一个运单跟系统交待清楚也得费半天劲呢。所以,用户每次也就是问系统一个问题,对性能要求没那么高啊。你就别这儿较劲了吧
太高兴了,问题解决,多谢搜索引擎,多谢各位朋友。下面是带默认值的查询的写法,大家斧正 注:ID =1的记录专为写查询而写的空记录。 比如查询长沙的组名,SELECT TOP 1 * FROM (SELECT 组名 FROM 组目的站 WHERE and 目的站='长沙' UNION SELECT "长沙" as 组名 FROM 组目的站 WHERE ID=1)
刚才研究了一下你那个关于动物的SQL语句,你可以在表中建立一个参数查询,或者在程序中构造SQL语句用变量替代下面的参数@1: select a.动物,iif(a.c=0,'安全',b.危险性) as 危险性 from (select @1 as 动物,count(动物) as c from tb where 动物=@1) a left join (select 动物,危险性,count(动物) as c from tb group by 动物,危险性) b on a.动物=b.动物 and a.c=b.c where a.动物=@1
if rs.stateclosed then rs.close
rs.open strsql,conn,adopenkeyset,adlockreadonly
if rs.recordcount>0 then
msgbox text1.text & space(2) & rs!危险性 &""
else
msgbox text1.text & space(2) & "安全"
end if
rs.close
如果是这样,没有关联表,直接用SQL语句的思路可以:
select count(动物) as c from tb where 动物='猫'
然后在程序中判断,c返回0,就是安全...
ID 动物 危险
1 熊 1
2 虎 1
3 蛇 1
4 猫 0rs.open " select * from t_animal where 危险 = 1 "
if rs.recordcount = 0 then msgbox "丫是安全的!"PS:不高效..
真正的表是熊 极度危险
狼 危险
虎 极度危险
菜花蛇 轻度危险要求sql完成以下任务,知道某动物名,如果在表中有该名,则返回狼 危险
如果无该名则返回
猫 安全总之,返回表要有两个字段,一是动物名,二是安全性。而安全性在表1中查,查不到就是安全。 而且要在sql中直接完成。因为类似的表有六七个,需要关联起来。
安全性类别,就查危险性表(没查到就是安全);
目的站类别,就查目的站表,没查到就是实际目的站,查到了就是特殊组名,本来直接将这样表关联起来,就可以用 where 安全性类别='安全',代理类别='普通',目的站类别='云南组' 这样的sql语句查到运价了。(可能有多条可用值)
问题在于
1、结构要求未查到的数据给一个默认值,有的就是数据本身,有的是固定的,这怎么处理啊!
2、不用关联很难处理,因为有些表的查询都可以给出多个值。用一个七重循环查无数次Sql不现实的说,而且最后还要给出可用运价条目列表,难道还要一一合并?
据说ACCESS里只有参数查询,没有存储过程。
strsql=" select 危险性 from A where 动物='"& text1.text &"'"
if rs.stateclosed then rs.close
rs.open strsql,conn,adopenkeyset,adlockreadonly
if rs.recordcount>0 then
msgbox text1.text & space(2) & rs!危险性 &""
else
msgbox text1.text & space(2) & "安全"
end if
rs.close
这个怎么不符合要求了? 挺好的阿
任务是做一个自动运价查询系统,输入各参数,(日期,代理,货物,重量,目的站,终点站,航班号,机型等等),返回可用的运价条目。
现在卡住了,举个简化的例子,忽略其它参数。运价规定。(注:除有指定分组外都是普通代理,且不可能将代理名全部记录在数据库)
普通代理 1元/公斤
代理组A 0.5元/公斤
代理组B 0.2元/公斤现在如果能用Sql语句在代理表中生成一个形如
代理名 普通代理
代理名 代理组A
表,就可以用关联方式生成可用运价表了运价查询结果有2条(注:代理可选择不采用优惠,成为普通代理)
普通代理 1元/公斤
代理组A 0.5元/公斤在程序中用判断不可行,一个参数还好,因为有很多参数,那将导致七重循环查数据库,问题就在于没有数据返回默认值怎么写啊!
(1)你在ACCESS里选工具-》关系。
(2)然后把你所有的表都拖进去。
(3)把每个表的高度调到把所有字段都显出来
(4)拷屏
(5)把图片传上来
(6)OK
(2)你的程序的可维护性和可扩展性会比较的低。试想,如果日后你的业务逻辑有些微的变动,你都得费老鼻子劲取看那个复杂得吓死人的长SQL。一不小心错个括号都能害你一晚上找不出来哪里不对(因为可能有错的地方太多了,而且SQL调起来又没有VB那么简单)。
(1)“参数类别表查出多个值”是什么意思?(2)“七重循环”?没看出来有这个后果啊?(3)怎么会产生两个可用运价呢?一个运单会有明确的规定,是用代理还是不用代理。没说用不用代理的,系统统一按不用代理算。怎么会有两个运价呢?
同理,所有其他可能影响价格的因素,用户提交的运单里应该都有明确说明,否则就按缺省值处理。每个因素都是唯一明确的。得到每个因素的确定值之后,直接代到公式里算,就可以得到明确的运价。大致计算过程如下:查询1:得到因子1的具体值X1;
查询2:得到因子2的具体值X2:
……
查询7:得到因子7的具体值X7。代入计算公式,假设运算公式是f(),那么运价就等于f(X1,X2, ……, X7)也就是:这7个互不相干的因子可以分别去取值,没有嵌套循环的必要。
要不你发到ACCESS版去试试,那边SQL语句高手比较多...
注:ID =1的记录专为写查询而写的空记录。
比如查询长沙的组名,SELECT TOP 1 *
FROM (SELECT 组名
FROM 组目的站
WHERE and 目的站='长沙'
UNION SELECT "长沙" as 组名
FROM 组目的站
WHERE ID=1)
select a.动物,iif(a.c=0,'安全',b.危险性) as 危险性
from (select @1 as 动物,count(动物) as c from tb where 动物=@1) a
left join (select 动物,危险性,count(动物) as c from tb group by 动物,危险性) b
on a.动物=b.动物 and a.c=b.c
where a.动物=@1
代理组A 长沙 海鲜皮鞋类 2元普通代理 北京 普通类 2元
代理组B 北京 服装类 1元
普通代理 天津 普通类 1元
代理组C 天津 皮鞋类 0.5元
一看就知道,这是针对特殊站点的特殊货物且特殊代理有特殊运价。
则货物类表的设计为皮鞋 海鲜皮鞋类
皮鞋 皮鞋类
服装 服装类看到了吗。多值就出来了。而且理论上说,几乎所有参数都可以多值
感觉参数这样定义不是很合理。东西都鸟在一起,有点混乱的说。比如你现在举出的这个X1就是站点、货物、代理鸟在一起,你自己都无法用一个词来定义它。不知你能否从中总结出规律?比如:(1)所有货物都有基本运价:basicPrice(单位为:元/吨×公里)。就是重量一定、运输距离一定的运单的基本运价都是相同的。
(2)代理因子:如果用代理A,在基本运价上打八折;如果用代理B,在基本运价基础上打九折。
(3)目的站点因子:如果目的地是特别站点,在基本运价上每吨每公里加多少元。(可以查目的站点表,每个站点都有明确的值)
(4)种类因子:如果货物种类是特别种类,在基本运价上每吨每公里加多少元。(这个也到表里去查)总而言之,感觉你的运价计算模型有点衰,呵呵
on A.动物=B.动物