数据库 将多条SQL语句查询的内容整合成为一个元组

1.情景再现

分类信息住户租户快递亲友访问
花苑138254489
新城341507834

以上的一张表中,假如要分别在两个住宅小区统计各类进出的人数,进出的类型可以分为是住户,租户,快递以及亲友访问四个类型。

但是实际的表设计中,住户以及租户是属于这个小区,可以直接统计出来,但是快递以及亲友访问则需要从进出记录查找。

换言之,就是表中的每个元组的数据是从多个表中查出来的,同时可能是用四条sql语句中查询出来的。使用如下表达:

①: select t.name as comunityName,

count(t.type) as ownerNumber

from  ownerTable t

②: select t.name as comunityName,

count(t.type) as rnetNumber

from  rentTable t

③: select t.name as comunityName,

count(t.type) as expressNumber

from  inviterTable t

where t.inviterType = 'express'

④:select t.name as comunityName,

count(t.type) as friendNumber

from  inviterTable t

where t.inviterType = friend

以上四条语句查询出来的四个结果,最终我们需要的是一个完整的元组数据类似于:

花苑138254489

2.解决方案

利用Oracle提供的union all函数,进行查询结果的一个全连接,并且构造每一个查询结果的一个元组,sql语句如下

select comunityName,

   ownerNumber,

   rentNumber,

   expressNumber,

   friendNumber

from(  

     select t.name as comunityName,

    count(t.type) as ownerNumber,

    0 as rentNumber,

    0 as expressNumber,

    0 as friendNumber

    from  ownerTable t

    group by t.id

 

  union all

 

     select t.name as comunityName,

    0 as ownerNumber,

    count(t.type) as rentNumber,

    0 as expressNumber,

    0 as friendNumber

    from  rentTable t

    group by t.id

 

  unoin all

 

     select t.name as comunityName,

    0 as ownerNumber,

    0 as rentNumber,

    count(t.type) as expressNumber,

    0 as friendNumber

    from  inviterTable t

    where t.inviterType = 'express'

    group by t.id

 

  union all

 

    select t.name as comunityName,

    0 as ownerNumber,

    0 as rentNumber,

    0 as expressNumber,

    count(t.type) as friendNumber

    from  inviterTable t

    where t.inviterType = friend

    group by t.id  

  ) group by comunityName;

 

3.实现解读

以上的SQL语句中,针对第一步所涉及道德SQL语句,每条都补全了所需要展示的四个维度,住户,租户,快递,亲友。

每条SQL语句都会产生一个元组,但是没有数据的部分会置0,然后针对四条SQL语句的查询结果进行一个unoin操作,根据每个元组共同的一个值

comunityName进行一个元组的联接,并且列出所有的出现过的comunityName的值,如果其后续的数据没有则按照默认值补充。

 

转载于:https://www.cnblogs.com/jenzg/p/4668982.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值