将需要两次查询的不相干的查询通过一条查询语句返回结果
2007-03-17 10:30
176 查看
将需要两次查询的不相干的查询通过一条查询语句返回结果,这往往在统计查询中非常有用,因为统计需要显示很多统计数据,涉及到的表比较多,所以如果能一条语句返回所有结果,对于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 得到最后结果.
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 得到最后结果.
相关文章推荐
- 将需要两次查询的不相干的查询通过一条查询语句返回结果
- 将需要两次查询的不相干的查询通过一条查询语句返回结果
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- JAVA 数据库查询返回两次结果集
- MySq之一条mysql语句来更新(插入)查询结果
- C#通过SQL语句查询结果分页不用GridView的实现
- SQL Server 各种查询语句执行返回结果
- 好947 Mybatis 配置resultMap 带参数查询Map 注意selectOne数据库返回结果一条数据库 否则会报错
- Mysql组合查询-UNION-多个SELECT语句作为单个查询结果返回
- 数据库查询一条语句就需要很长的时间
- oracle 动态拼接语句并返回查询结果集
- 输入的字符串分割后 ,通过查询语句查询结果集
- Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表)
- 统计:后台通过查询数据表(该表存放统计的sql语句)返回规定格式的json数据
- 关于postgres一条sql语句中子查询的返回值不止一个,且拼接成相关规则的字符串
- C# SQL语句参数化,通过包含like关键字的子句查询无结果问题
- SQL数据库查询实现行转列与列转行结果SQL语句(适用于SqlServer数据库,oracle需要修改case when语句)
- sql联合查询 一条select语句 查询多个结果,显示
- java jdbc调用oracle的函数或过程返回SQL语句查询的结果集
- 在HQL select查询语句中自定义查询结果返回的数据类型