将需要两次查询的不相干的查询通过一条查询语句返回结果

将需要两次查询的不相干的查询通过一条查询语句返回结果,这往往在统计查询中非常有用,因为统计需要显示很多统计数据,涉及到的表比较多,所以如果能一条语句返回所有结果,对于WEB分页的处理也很方便.下面介绍几种方法:

1.使用全外连接(full outer join). 处理方法是,先分别按照需要得到查询结果A,B等,然后使用

  select * from A full outer join B on A.XX=B.XX ,这样就可以将不相干查询通过条SQL语句返回给上层处理.

在oracle9i中使用full outer join存在bug,经常导致查询结果混乱,例如

select * from(

select a.nsrsbh 企业税号 ,count(*) 咨询人数,sum(decode(b.hasmyddc,'Y',myd,0)) 咨询满意度总数,sum(decode(b.hasmyddc,'Y',1,0)) 咨询满意度统计人数,sum(decode(b.hasmyddc,'Y',myd,0))/decode(sum(decode(b.hasmyddc,'Y',1,0)),0,1,sum(decode(b.hasmyddc,'Y',1,0))) 咨询平均满意度 from fwgl_zxjlb a,fwgl_thjlb b where a.fzjg_dm=b.fzjg_dm(+) group by a.nsrsbh
) tt

FULL OUTER JOIN

(
select c.nsrsbh 企业税号,count(*) 上门人次,sum(nvl(c.YHXCMYD,0)) 上门满意度总数,sum(decode

(c.YHXCMYD,null,0,1)) 上门满意度统计人数,sum(nvl(c.YHXCMYD,0))/decode(sum(decode

(c.YHXCMYD,null,0,1)),0,1,sum(decode(c.YHXCMYD,null,0,1))) 上门平均满意度 from FWGL_PFD

c,FWGL_PFDRWFP d where c.pfdid=d.pfdid(+) and c.fzjg_dm=d.fzjg_dm(+) group by c.nsrsbh
) ttt

on tt.企业税号=ttt.企业税号

当然, 看不懂这个SQL语句也没关系,你只需要注意这个语句的几个特点就可以了,第一,明白我做连接的目的,是希望本来应该做两次查询返回的结果,通过全外连接一次返回; 第二,两个红色部分表示分别经过子查询得到的两张临时表(暂时可以这么理解) ,同时这两个查询得到的结果并没有必然联系;第三,在这两张临时表上做全外连接FULL OUTER JOIN, 连接的条件是税号相同;  

  现在按道理来讲,如果两张临时表在税号上做了全外连接之后,记录条数应该比两张临时表条数总和要少,但是结果出人意料的是,结果居然多除了100多条. 如果将两张临时表的连接顺序换一下,得到的记录条数又比正确结果条数少.

2.使用左外连接和右外连接以及联合.处理方法是,先分别按照需要得到查询结果A,B等,然后使用

  select * from A left outer join B on A.XX=B.XX

 union all

select * from A right outer join B on A.XX=B.XX

 ,这样也可以将不相干查询通过条SQL语句返回给上层处理.

3.直接使用联合,不过这次的处理,则需要分别对A,B中的结果字段进行处理,例如,A结果包含了 姓名 性别,B结果包含了企业名,企业地址.那么在得到结果之前对SQL做一下处理, 使返回的字段个数和名称相同, 对A:  select  姓名 ,性别, ""  as 企业名, "" as 企业地址, from XXXX     ;  对B: select  "" as 姓名, "" as 性别 , 企业名 , 企业地址 from XXXX   ;然后对A,B进行联合 A union B 得到最后结果.

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值