楼主: 4pal

[精华] 一个sql

[复制链接]
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
41#
发表于 2002-8-6 09:52 | 只看该作者

Re: Re: 所以要这样呀!

最初由 easyfree 发布
[B]

再罗嗦一句:
group by中已经使用了distinct, 就不必使用flying view了, 影响效率
distinct是比较耗时的操作, 考虑这个例子中聚组之后的row很少, 才这样写,  当然具体优化还是要检查执行路径

sql实现是一个思路, 真正应用效率又是一个思路, 不一样的 [/B]

==========================================================
这位兄弟说group by 回使用聊distinct,那么在HAVING中用COUNT(*)DE 到的确实没有小区重复的 数据,这又是怎原因?

使用道具 举报

回复
论坛徽章:
0
42#
发表于 2004-3-1 12:13 | 只看该作者
table test_hg(name,num)

select a.name from (select name,num from test_hg where num = 1) a,
(select name,num from test_hg where num = 3) b,
(select name,num from test_hg where num = 5) c
where a.name = b.name
and   a.name = c.name

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
43#
发表于 2004-3-1 13:01 | 只看该作者
这么老的帖子都翻出来了?

使用道具 举报

回复
论坛徽章:
0
44#
发表于 2004-3-1 17:12 | 只看该作者
既然翻出来了,我再加个算法:
   select ename from emp group by ename having max(decode(sal,10,1,0)) + max(d
ecode(sal,50,1,0)) + max(decode(sal,100,1,0)) = 3

使用道具 举报

回复
论坛徽章:
0
45#
发表于 2004-3-5 09:52 | 只看该作者
select    distinct
             a.*
from       test a,
              test b
where    a.name = b.name and
              a.numer in (1,3,5)
order by 1,2

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
46#
发表于 2005-9-17 16:42 | 只看该作者

我倒,这题讨论这么久?嘿嘿

只要你有1,3,5,(换其它'hehe','haha','xixi'也一样)出现一次,记为1,再出现还是1,然后用max来取一次,没出现就是空了,之后相加等于3的必定出现1,3,5至少各一次.
select grp from (
select grp,
       max(decode(val, '1', 1))+
       max(decode(val, '3', 1))+
       max(decode(val, '5', 1)) rn
  from tbl_a
group by grp
)
where rn=3

使用道具 举报

回复
论坛徽章:
18
授权会员
日期:2007-03-20 21:21:402014年新春福章
日期:2014-02-18 16:41:112012新春纪念徽章
日期:2012-01-04 11:50:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282011新春纪念徽章
日期:2011-02-18 11:43:342010广州亚运会纪念徽章:自行车
日期:2010-11-22 15:27:372010新春纪念徽章
日期:2010-03-01 11:19:06生肖徽章2007版:猴
日期:2009-11-18 16:42:41CTO参与奖
日期:2009-02-12 11:45:48ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
47#
发表于 2005-9-19 08:52 | 只看该作者
好东西!!!

使用道具 举报

回复
论坛徽章:
0
48#
发表于 2005-9-19 10:53 | 只看该作者
每次看到tt,biti_rainy,总能收获一些实质性的东东。

再去网上看看decode 地用法

使用道具 举报

回复
论坛徽章:
0
49#
发表于 2005-9-19 11:02 | 只看该作者
刚刚在网上看到decode() 地用法,可供初学者使用:

decode()函數使用技巧

decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

该函数的含义如下:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)

ELSE
    RETURN(缺省值)
END IF
·        使用方法:
1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1

例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。

使用道具 举报

回复
论坛徽章:
0
50#
发表于 2006-2-11 13:21 | 只看该作者

看精华贴有感: 当ORACLE有了CASE表达式.

当ORACLE有了CASE表达式, 这个问题就有了一个简单的解决方案

SQL> select name
  2     from (
  3       select name, val
  4         from test
  5         group by name, val)
  6     group by name
  7     having count(case when val in (1, 3, 5) then 1 end) = 3;

NAME
----------
a
b

SQL> select * from test;

NAME              VAL
---------- ----------
a                   1
b                   1
a                   3
c                   3
d                   2
e                   4
f                   5
a                   5
d                   3
d                   6
b                   5
c                   4
b                   3
c                   3
c                   3

已选择15行。

看精华有感, 回了这个贴子, 有不当这处请多包含!

使用道具 举报

回复

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

本版积分规则 发表回复

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