楼主: 4pal

[精华] 一个sql

[复制链接]
论坛徽章:
4
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-05-19 12:39:15行业板块每日发贴之星
日期:2006-11-17 01:08:18
21#
发表于 2002-7-24 16:45 | 只看该作者

如果你想消除重复代码……

楼上的都是高手大侠,我看了半天也学习了不少东东,

有人说要消除表中的重复的行,比如你的表中就有

c 3
c 3

这样的列,那么使用decode的时候,是不是要add两次-1呢?

是不是要这样就好些呢:

select name
from (select distinct * from test)
group by name
having sum(decode(number,1,-1,3,-1,5,-1,0)) = -3

对了,还有就是在decode()函数的最后一个参数,是不是
要将binary_rainy写的number改写成0呢?因为如果不改变
的话,其他的数字保持原来的数字值,这样,即使满足1,
3,5的要求,有其他的号码进行sum()运算后,是不是也不
符合最后等于-3 的预想值呢。我觉得改为0就好些了吧。

不知道我这样说是不是有道理,请教诸大侠……

使用道具 举报

回复
论坛徽章:
25
ITPUB元老
日期:2005-02-28 12:57:00管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
22#
发表于 2002-7-24 16:46 | 只看该作者

看来还要抛砖



1. 要考虑重复的问题, 比如上述例子里面, 加一row:  a  1  ,  那么=-3就不行了,需要<=-3
2. 要考虑效率问题, 其实语句还应当加入一个where条件:  where number not in (1,3,5),  这样, 即便应用中出现:  包含1,3, -6这样的要求, 也还是通用的

这样, 最简单的写法就是:

select name
from test
where number not in (1,3,5)
group by name
having count(distinct number)=3

使用道具 举报

回复
论坛徽章:
4
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-05-19 12:39:15行业板块每日发贴之星
日期:2006-11-17 01:08:18
23#
发表于 2002-7-24 17:00 | 只看该作者

Re: 看来还要抛砖

最初由 easyfree 发布
[B]

1. 要考虑重复的问题, 比如上述例子里面, 加一row:  a  1  ,  那么=-3就不行了,需要<=-3
2. 要考虑效率问题, 其实语句还应当加入一个where条件:  where number not in (1,3,5),  这样, 即便应用中出现:  包含1,3, -6这样的要求, 也还是通用的

这样, 最简单的写法就是:

select name
from test
where number not in (1,3,5)
group by name
having count(distinct number)=3 [/B]




哇!你这样写也是很经典的呀!!!

但是根据人家的意思,是不是要在where子句中这样写呢:

where number in (1,3,5)

就是把not去掉哦! :)

使用道具 举报

回复
论坛徽章:
25
ITPUB元老
日期:2005-02-28 12:57:00管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
24#
发表于 2002-7-24 17:06 | 只看该作者

呵呵

顺手, 写错了, 是in, 当然in和or哪个更有效一些我没有测试过, 记得一本书说过, 即使是常量, 也尽量不写in 而改写为or, 我没有测试值
另: number是保留字, 改写为num了:

select name
from test
where  num=1 or num=3 or num=5
group by name
having count(distinct num)=3

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
25#
发表于 2002-7-24 17:07 | 只看该作者

哎呀

你们怎么都没有看人家最后写的那个啊

sign(sum(decode(...)))  + sign(sum(decode(...))) + sign(sum(decode(...)))  = -3 已经解决了这个问题啦

要将binary_rainy写的number改写成0呢?:
我说的是正数的情况下,如果也存在负数,那就这样做好了

不过老大的这个也很好
select name
from test
where number  in (1,3,5)
group by name
having count(distinct number)=3

只是具体运行效率只能靠实际测试来检查啦
不好妄下断言了

使用道具 举报

回复
论坛徽章:
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
26#
发表于 2002-7-24 17:14 | 只看该作者

Re: 看来还要抛砖

最初由 easyfree 发布
[B]

1. 要考虑重复的问题, 比如上述例子里面, 加一row:  a  1  ,  那么=-3就不行了,需要<=-3
2. 要考虑效率问题, 其实语句还应当加入一个where条件:  where number not in (1,3,5),  这样, 即便应用中出现:  包含1,3, -6这样的要求, 也还是通用的

这样, 最简单的写法就是:

select name
from test
where number not in (1,3,5)
group by name
having count(distinct number)=3 [/B]


果然厉害。

不过好像第一条有问题,考虑重复不能简单<=-3.

比如
a  1
a  1
a  1
a  3
查询的结果是-4,但并没有包含number值是5。

使用道具 举报

回复
论坛徽章:
4
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-05-19 12:39:15行业板块每日发贴之星
日期:2006-11-17 01:08:18
27#
发表于 2002-7-24 17:47 | 只看该作者

所以要这样呀!

所以要在from子句中的test改换成

(select distinct * from test)

的呀!


结果就是这样的哦:

select name

from (select distinct * from test)

where number not in (1,3,5)
group by name
having count(distinct number)=3

恩,差不多就这样了! :)

使用道具 举报

回复
论坛徽章:
2
会员2006贡献徽章
日期:2006-04-17 13:46:342009日食纪念
日期:2009-07-22 09:30:00
28#
 楼主| 发表于 2002-7-24 18:34 | 只看该作者

Re: 看来还要抛砖

最初由 easyfree 发布
[B]

2. 要考虑效率问题, 其实语句还应当加入一个where条件:  where number not in (1,3,5),  这样, 即便应用中出现:  包含1,3, -6这样的要求, 也还是通用的

/B]


嗯,这块砖头砸得好啊,我喜欢,以后多砸点呀,嘿嘿

我去access一用,不行,distinct 支持太差

使用道具 举报

回复
论坛徽章:
0
29#
发表于 2002-7-25 10:35 | 只看该作者
这么写行不行
select name from test where number1=1
  intersect
  select name from test where number1=3
  intersect
  select name from test where number1=5

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
30#
发表于 2002-7-25 12:54 | 只看该作者

你这样写也是可以的

但你进行了3次表扫描

然后再是2次集合操作

有可能这个效率还不如join

只是期望表扫描一次而已

使用道具 举报

回复

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

本版积分规则 发表回复

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