| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 839 人关注过本帖, 1 人收藏
标题:select 使用经验 (3)
只看楼主 加入收藏
jjjlan
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2004-11-24
收藏(1)
 问题点数:0 回复次数:0 
select 使用经验 (3)

join联接中on 条件表达式的技巧】

标准的join字句是这样的

[DatabaseName!]Table [[AS] Local_Alias]

[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN

DatabaseName!]Table [[AS] Local_Alias]

[ON JoinCondition ...]

join这里是没得改变得了,但在“ON”这里就有文章可做了。既然ON后面跟得是一条逻辑表达式,那这条表达式就可以任写而不必一定要table1.字段1=table2.字段3这样了。在多表查询的时候,在这里适当的加些过滤条件又可省不少功夫。

例如做原材料管理时,每次进货、原材料不合格退货都有记录的。现在老板就想知道某段时间向某个客户的进了多少货及退了多少货,从而知道这个客户的原材料质量好不好。

表结构如下:

客户表khbkhbh,khmx

原材料表yclbyclbh,yckmc,yclgg

进货单jhdjhdbh,jhrq,khbh(即这次是向那个客户进货的)

进货单明细jhdmxjhdbh,yclbh,jhsl

退货单thdthdbh,thrq,khbh(同上)

退货单明细thdmxthdbh,yclbh,thsl

where字句的使用技巧】

这里头的技巧可就多了,真是学都学不完。

union的使用技巧】

这个字句没什么,只是将几个select后产生的在结构完全一样的表加在地块,变成一个表。具体的例子如下(以下例子不计较这种设计方法的好坏,只是说明命令的使用)

在做生产管理时,原材料的每笔进货、领用、报废、退货情况都要详细记录,老板随时都可能了解一个月内每种原材料的各种情况。而编程时对数据的规范化后,必然要用好几个表来记录这四种操作。现在为了更快的求出结果,命令当然是越少越好。各个表的结构如下:

进货单jhdjhdbh,jhrq

进货单明细jhdmx:jhdbh,yclbh,jhsl

领货单lhdlhdbh,lhrq

领货单明细lhdmx:lhdbh,yclbh,lhsl

报废单bfdbfdbh,bfrq

报废单明细bfdmx:bfdbh,yclbh,bfsl

退货单thdthdbh,thrq

退货单明细thdmx:thdbh,yclbh,thsl

原材料表yclb:yclbh,yclmc,yclgg

查询日期范围放在begindata,enddata

为简便起见,只计算进货和退货,其它的照样做就行了。

Sele yclbh,sum(jhsl) as jhsl,100000.00-100000.00 as thsl ;

From jhd join jhdmx ;

On jhd.jhdbh=jhdmx.jhdbh ;

Where betw(jhd.jhrq,begindata,enddata) ;

Grou by yclbh ;

Union ;

Sele yclbh,100000.00-100000.00 ,sum(thsl) ;

From thd join thdmx ;

On thd.thdbh=thdmx.thdbh ;

Where betw(thd.thrq,begindata,enddata) ;

Grou by yclbh ;

Into curs temp1

这样就会产生这样的结果

yclbh jhsl thsl

00001 3432 0

00002 4234 0 │这些是第一节select产生的

……

00002 0 3423

00003 0 4234 │这些是第二节select产生的

……

现在再对临时表temp1进行一次合计

sele yclbh,sum(jhsl) as jhsl,sum(thsl) as thsl ;

from temp1 ;

grou by yclbh ;

into curs temp2

这个temp2就是结果了。

1:如果要计算四种操作的话,就再加多两节select就行了。

2:在命令里使用100000.00-100000.00这样奇怪的表达式是因为select对那些要计算的、事先不能确定长度和类型的字段,它是根据运算过程中产生的第一条记录中,该字段的值来确定这个字段的类型和长度。所以以上那条命令,第一个记录中thsl它是不知道长度是多少的,如果直接用0的话,那它就以为这个字段是数值型,长度是1,没有小数位。这当然不行,所以就要用这样一个表达式,来使它知道这个字段有9位长,小数位是2

搜索更多相关主题的帖子: select 经验 
2005-06-18 13:38
快速回复:select 使用经验 (3)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014561 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved