查看: 5173|回复: 9

【大话IT】一个需求的SQL

[复制链接]
论坛徽章:
4
优秀写手
日期:2015-01-01 06:00:05优秀写手
日期:2015-02-12 06:00:14沸羊羊
日期:2015-03-04 14:53:522015年新春福章
日期:2015-03-06 11:58:39
发表于 2015-2-9 16:01 | 显示全部楼层 |阅读模式
由于业务更改,比如:
select 'a' name,1 num_l from dual
union all
select 'a' name,2 num_l from dual
union all
select 'a' name,3 num_l from dual
union all
select 'b' name,2 num_l from dual
union  all
select 'b' name,3 num_l from dual
union all
select 'b' name,4 num_l from dual
union all
select 'c' name,1 num_l from dual
union
select 'c' name,5 num_l from dual;


如果name相同的一组中,对应的num_l中有要求的值,则将全组的数据输出:
类似结果为:
with temp   as (
select 'a' name,1 num_l from dual
union all
select 'a' name,2 num_l from dual
union all
select 'a' name,3 num_l from dual
union all
select 'b' name,2 num_l from dual
union  all
select 'b' name,3 num_l from dual
union all
select 'b' name,4 num_l from dual
union all
select 'c' name,1 num_l from dual
union
select 'c' name,5 num_l from dual)
select  * from temp t1
where t1.name in ( select name from temp where num_l  =1);


但是事实中,表的数据量有点大,有什么别的写法比如用开窗函数来提高性能?







论坛徽章:
4
优秀写手
日期:2015-01-01 06:00:05优秀写手
日期:2015-02-12 06:00:14沸羊羊
日期:2015-03-04 14:53:522015年新春福章
日期:2015-03-06 11:58:39
 楼主| 发表于 2015-2-9 16:07 | 显示全部楼层

数据原型

数据原型
数据的原型

使用道具 举报

回复
论坛徽章:
4
优秀写手
日期:2015-01-01 06:00:05优秀写手
日期:2015-02-12 06:00:14沸羊羊
日期:2015-03-04 14:53:522015年新春福章
日期:2015-03-06 11:58:39
 楼主| 发表于 2015-2-9 16:09 | 显示全部楼层
22.png num_l中有1的组的全部数据

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2015-2-9 16:36 | 显示全部楼层
[font]

如下:

SQL> with temp   as (
  2  select 'a' name,1 num_l from dual
  3  union all
  4  select 'a' name,2 num_l from dual
  5  union all
  6  select 'a' name,3 num_l from dual
  7  union all
  8  select 'b' name,2 num_l from dual
  9  union  all
10  select 'b' name,3 num_l from dual
11  union all
12  select 'b' name,4 num_l from dual
13  union all
14  select 'c' name,1 num_l from dual
15  union
16  select 'c' name,5 num_l from dual)
17  select  name,
18          num_l
19  from
20  (select name,
21          num_l,
22          sum(decode(num_l, 1, 1, 0)) over(partition by name) flag
23     from temp)
24  where flag <> 0;

NAME      NUM_L
---- ----------
a             1
a             2
a             3
c             1
c             5

SQL>



使用道具 举报

回复
论坛徽章:
4
优秀写手
日期:2015-01-01 06:00:05优秀写手
日期:2015-02-12 06:00:14沸羊羊
日期:2015-03-04 14:53:522015年新春福章
日期:2015-03-06 11:58:39
 楼主| 发表于 2015-2-9 16:55 | 显示全部楼层
luckyluke01 发表于 2015-2-9 16:09
num_l中有1的组的全部数据

可以,而且代价要比循环节约2/3,谢了!

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
发表于 2015-2-9 16:56 | 显示全部楼层
你的方法也可以啊,改写成inner join的连接就OK了

使用道具 举报

回复
论坛徽章:
4
优秀写手
日期:2015-01-01 06:00:05优秀写手
日期:2015-02-12 06:00:14沸羊羊
日期:2015-03-04 14:53:522015年新春福章
日期:2015-03-06 11:58:39
 楼主| 发表于 2015-2-9 17:15 | 显示全部楼层
lastwinner 发表于 2015-2-9 16:56
你的方法也可以啊,改写成inner join的连接就OK了

试了试,但是是代价最高的一种方式,也许是统计信息不太准吧,但是用开窗是目前最合适的。

使用道具 举报

回复
论坛徽章:
2
喜羊羊
日期:2015-03-04 14:52:462015年新春福章
日期:2015-03-06 11:58:18
发表于 2015-2-9 23:50 | 显示全部楼层
  1. 不能理解开窗怎么还消耗小? 如果在num1上建立bitmap 。是不是秒出来数据?
复制代码

使用道具 举报

回复
论坛徽章:
2
沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47
发表于 2015-2-11 15:54 | 显示全部楼层
with temp   as (
select 'a' name,1 num_l from dual
union all
select 'a' name,2 num_l from dual
union all
select 'a' name,3 num_l from dual
union all
select 'b' name,2 num_l from dual
union  all
select 'b' name,3 num_l from dual
union all
select 'b' name,4 num_l from dual
union all
select 'c' name,1 num_l from dual
union
select 'c' name,5 num_l from dual)
select  * from temp t1
where exists (select 1 from temp t2 where t2.name = t1.name and t2.num_l = 1);

直接用exists会不会更好点呢?

使用道具 举报

回复
论坛徽章:
4
2012新春纪念徽章
日期:2012-01-04 11:58:18鲜花蛋
日期:2012-03-12 15:51:272015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
发表于 2015-2-13 17:15 | 显示全部楼层
select * from temp t2  start with num_l = 1 connect by prior name = name 怎么样?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表