A表------>B表-------->C表 要求:通过A.P查找B.P  ---> 再通过B.K查找C.K  ----> 按B.k等于C.K查找出所有记录总对所有NUM进行汇总
A表结构 B表结构 C表结构
 __________                 __________                _____________
|__NO_|__ P_| |__P_|__K_|         |_K__|__NUM__|
|_____|____|          |____|____|               |_____|______|

像这样以A表的一个字段去查询B表的一个字段再以B表所查出的记录中的某个字段值
去查询C表的中的记录,并对查出的所有记录的某列进行汇总.这样的查询语句该怎么写
如何写效率才高???

解决方案 »

  1.   

    上面的显示有点乱了再说明一下
    假设:A表有NO,P两个字段 B表有P,K两个字段 C表有K,NUM两个字段
      

  2.   

    有点迷糊select sum(c.num) from a,b,c 
    where a.p=b.p
    and b.k=c.k 对不
      

  3.   

    不对吧,因为select * from a,b where a.p=b.p 查询的结果
    有可能为多条记录
    并且A表中的记录我全部要.
    我A表中的记录都要显示,而通过a.p=b.p and b.k=c.k没找到
    c.num时,c.num的值显示为0 
    比如按这安成生成一个新表为
                               a.p    c.num
                               S       5
                               V       0
    唉,不能发图片这里说的不是很清楚
      

  4.   

    试一下
    select d.p,nvl(c.num,0) from c,(select a.p,b.k from a,b where a.p(+)=b.p) d where d.k(+)=c.k
      

  5.   

    where条件中用到的字段最好是索引,这样效率会好很多
      

  6.   

    select d.p,nvl(c.num,0) from c,(select a.p,b.k from a,b where a.p(+)=b.p) d where d.k(+)=c.k上面句子中(+)是什么意思???
      

  7.   

    外部联接"+"的用法   外部联接"+"按其在"="的左边或右边分左联接和右联接.若不带"+"运算符的表中的一个行不直接匹配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回.若二者均不带’+’,则二者中无法匹配的均被返回.利用外部联接"+",可以替代效率十分低下的 not in 运算,大大提高运行速度.例如,下面这条命令执行起来很慢 select a.empno from emp a where a.empno not in (select empno from emp1 where job=’SALE’);   倘若利用外部联接,改写命令如下: select a.empno from emp a ,emp1 b where a.empno=b.empno(+) and b.empno is null and b.job=’SALE’;   可以发现,运行速度明显提高.
      

  8.   

    同意jiabao1999(jiabao1999) 的做法
      

  9.   

    select sum(c.num) from a inner join on(a.p=b.p) inner join on(b.k=c.k );+好像不太常用了
      

  10.   

    同意jiabao1999(jiabao1999) 的做法,很对
      

  11.   

    APOLLO_TS(才饮酒中水,又闻稻花香) 同意这个哥们的!
      

  12.   

    It is not very complex.