【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这样了。在多表查询的时候,在这里适当的加些过滤条件又可省不少功夫。
例如做原材料管理时,每次进货、原材料不合格退货都有记录的。现在老板就想知道某段时间向某个客户的进了多少货及退了多少货,从而知道这个客户的原材料质量好不好。
表结构如下:
客户表khb:khbh,khmx
原材料表yclb:yclbh,yckmc,yclgg
进货单jhd:jhdbh,jhrq,khbh(即这次是向那个客户进货的)
进货单明细jhdmx:jhdbh,yclbh,jhsl
退货单thd:thdbh,thrq,khbh(同上)
退货单明细thdmx:thdbh,yclbh,thsl
【where字句的使用技巧】
这里头的技巧可就多了,真是学都学不完。
【union的使用技巧】
这个字句没什么,只是将几个select后产生的在结构完全一样的表加在地块,变成一个表。具体的例子如下(以下例子不计较这种设计方法的好坏,只是说明命令的使用):
在做生产管理时,原材料的每笔进货、领用、报废、退货情况都要详细记录,老板随时都可能了解一个月内每种原材料的各种情况。而编程时对数据的规范化后,必然要用好几个表来记录这四种操作。现在为了更快的求出结果,命令当然是越少越好。各个表的结构如下:
进货单jhd:jhdbh,jhrq
进货单明细jhdmx:jhdbh,yclbh,jhsl
领货单lhd:lhdbh,lhrq
领货单明细lhdmx:lhdbh,yclbh,lhsl
报废单bfd:bfdbh,bfrq
报废单明细bfdmx:bfdbh,yclbh,bfsl
退货单thd:thdbh,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。