sql?急

fuyou001 2009-05-07 08:32:10
加精
select count(distinct main_domain) from spd_domain t where t.is_chinese_site = 0 and t.alexa_ranking =-1
结果 1635t条记录


select count(*)
from (select DOMAIN,
DOMAIN_SOURCE,
MAIN_DOMAIN,
RECORD_DATE,
STATUS,
ALEXA_RANKING,
IS_CHINESE_SITE,
STATUS_DATE,
row_number() over(partition by MAIN_DOMAIN order by MAIN_DOMAIN) rn
from SPD_DOMAIN
where ALEXA = 0) t
where rn = 1
and t.IS_CHINESE_SITE = 0
and t.alexa_ranking = -1

结果61条记录

同一张表,为什么两个差异这么大?

表共有13万多记录
...全文
3239 71 打赏 收藏 转发到动态 举报
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
kangkzt 2010-05-14
  • 打赏
  • 举报
回复
51楼那个有意思的!
oracle_dba_11 2010-02-24
  • 打赏
  • 举报
回复
没机会得分了。不过51楼的分析很准确啊
hill124 2009-08-25
  • 打赏
  • 举报
回复
楼主玩潜水不厚道
出的难题给人破了
不好意思出来。。。。呵呵
hill124 2009-08-25
  • 打赏
  • 举报
回复
楼主
S_S_Ge 2009-05-11
  • 打赏
  • 举报
回复
学习中
wenxin40 2009-05-11
  • 打赏
  • 举报
回复
很好,现在学习中,勉强看懂
huhenggang 2009-05-10
  • 打赏
  • 举报
回复
这多高手啊!学习下。哈哈!
lvxiaojia19890819 2009-05-10
  • 打赏
  • 举报
回复
哎呀 就是上面的 答案 你的语法有问题
qqq83 2009-05-10
  • 打赏
  • 举报
回复
学习下
iM臭皮匠 2009-05-09
  • 打赏
  • 举报
回复
这多高手
wb1987611 2009-05-09
  • 打赏
  • 举报
回复
51楼那个有意思的!
Stonesk 2009-05-09
  • 打赏
  • 举报
回复
顶一下!
happy_z 2009-05-09
  • 打赏
  • 举报
回复
如果表内容不特殊的情况下,有些语句的结果是一样的,但若表记录复杂一些,就会出现同样的两条语句,在表1中使用结果是一样的,但同样在表2中执行后结果可能就不一样了,这是正常的,因为查询语句也有复杂的。其次是你的两个查询条件有不一致的地方。
Richard345265669 2009-05-09
  • 打赏
  • 举报
回复
学习吧
superhsj 2009-05-09
  • 打赏
  • 举报
回复
顶51楼,确实是这么回事
fuyou001 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 jiesure 的回复:]
后面的写了一条限制 “where ALEXA = 0” 有了这个限制 就不是同一张表了。
[/Quote]
yanleiyigan 2009-05-08
  • 打赏
  • 举报
回复

理想情况下这两种查询返回记录总数是一样的

请看以下分析:

数据1(理想数据,第一条记录符合条件)
main_domain is_chinese_site alexa_ranking ALEXA
test.com 0 -1 0
test.com 1 -1 0
test.com 0 -1 1

数据2(非理想数据,第二条记录符合条件)
main_domain is_chinese_site alexa_ranking ALEXA
test.com 1 -1 0
test.com 0 -1 0
test.com 0 -1 1

执行 row_number() over(partition by main_domain order by MAIN_DOMAIN) 之后返回

数据1
main_domain is_chinese_site alexa_ranking ALEXA rn
test.com 0 -1 0 1
test.com 1 -1 0 2
test.com 0 -1 1 3

数据2
main_domain is_chinese_site alexa_ranking ALEXA rn
test.com 1 -1 0 1
test.com 0 -1 0 2
test.com 0 -1 1 3

查询
select count(*)
from (select row_number() over(partition by main_domain order by MAIN_DOMAIN) rn from SPD_DOMAIN) tmp
where rn=1 and IS_CHINESE_SITE = 0 and alexa_ranking = -1 and ALEXA = 0 时,数据1有记录,数据2无记录。

而查询
select count(distinct main_domain) from spd_domain t where t.is_chinese_site = 0 and t.alexa_ranking =-1 and ALEXA=0
数据1,数据2都有记录。


修改如下:

;with tmp
(
select * from SPD_DOMAIN where is_chinese_site = 0 and alexa_ranking =-1 and ALEXA=0
)

select count(*)
from (
select row_number() over(partition by main_domain order by MAIN_DOMAIN) rn from tmp
) tmp
where rn=1
yanleiyigan 2009-05-08
  • 打赏
  • 举报
回复

lz,
理想情况下你那两种查询方式返回记录总数是一样的

请看以下分析:

数据1(理想数据,第一条记录符合条件)
main_domain is_chinese_site alexa_ranking ALEXA
test.com 0 -1 0
test.com 1 -1 0
test.com 0 -1 1

数据2(非理想数据,第二条记录符合条件)
main_domain is_chinese_site alexa_ranking ALEXA
test.com 1 -1 0
test.com 0 -1 0
test.com 0 -1 1

执行 row_number() over(partition by main_domain order by MAIN_DOMAIN) 之后返回

数据1
main_domain is_chinese_site alexa_ranking ALEXA rn
test.com 0 -1 0 1
test.com 1 -1 0 2
test.com 0 -1 1 3

数据2
main_domain is_chinese_site alexa_ranking ALEXA rn
test.com 1 -1 0 1
test.com 0 -1 0 2
test.com 0 -1 1 3

查询
select count(*)
from (select row_number() over(partition by main_domain order by MAIN_DOMAIN) rn from SPD_DOMAIN) tmp
where rn=1 and IS_CHINESE_SITE = 0 and alexa_ranking = -1 and ALEXA = 0 时,数据1有记录,数据2无记录。

而查询
select count(distinct main_domain) from spd_domain t where t.is_chinese_site = 0 and t.alexa_ranking =-1 and ALEXA=0
数据1,数据2都有记录。


修改如下:

;with tmp
(
select * from SPD_DOMAIN where is_chinese_site = 0 and alexa_ranking =-1 and ALEXA=0
)

select count(*)
from (
select row_number() over(partition by main_domain order by MAIN_DOMAIN) rn from tmp
) tmp
where rn=1

zhangyong369 2009-05-08
  • 打赏
  • 举报
回复
顶MARK
assiwe 2009-05-08
  • 打赏
  • 举报
回复
改成 row_number() over(partition by main_domain order by DOMAIN) rn 试试?
加载更多回复(51)
跟着乐于分享的数据库大师梁敬彬抓住表象背后的SQL本质 有人就有江湖,有江湖就有IT系统,有IT系统就有数据库,有数据库就有SQLSQL应用可一字概括:“广”。加之其简单易学,SQL实现也可一字概括:“乐”。, 然而,SQL虽然实现简单可乐,却极易引发性能问题,那时广大SQL使用人员可要“愁”就一个字,心碎无数次了。, 缘何有性能问题?原因也一字概括:“量”。当系统数据量、并发访问量上去后,不良SQL就会拖跨整个系统,我们甚至找不出哪些SQL影响了系统。即便找到也不知如何动手优化。此时的心情也可以一字概括:“懵”。, 现在《收获,不止SQL优化——抓住SQL的本质》开始带你抛除烦恼,走进优化的可乐世界!, 首先教你SQL整体优化、快速优化实施、如何读懂执行计划、如何左右执行计划这四大必杀招。整这些干嘛呢?答案是,传授一个先整体后局部的宏观解决思路,走进“道”的世界。, 接下来带领大家飞翔在“术”的天空。教你体系结构、逻辑结构、表设计、索引设计、表连接这五大要领。这么多套路,这又是要干嘛?别,这是教你如何解决问题,准确地说,是如何不改写即完成SQL优化。, 随后《收获,不止SQL优化——抓住SQL的本质》指引大家学会等价改写、过程包
编辑推荐 方法意识巧妙融入,脑图表格清晰展现; 海量案例完美结合,线上线下拓展延伸。 内容简介 有人就有江湖,有江湖就有IT系统,有IT系统就有数据库,有数据库就有SQLSQL应用可一字概括:“广”。加之其简单易学,SQL实现也可一字概括:“乐”。 然而,SQL虽然实现简单可乐,却极易引发性能问题,那时广大SQL使用人员可要“愁”就一个字,心碎无数次了。 缘何有性能问题?原因也一字概括:“量”。当系统数据量、并发访问量上去后,不良SQL就会拖跨整个系统,我们甚至找不出哪些SQL影响了系统。即便找到也不知如何动手优化。此时的心情也可以一字概括:“懵”。 现在《收获,不止SQL优化——抓住SQL的本质》开始带你抛除烦恼,走进优化的可乐世界! 首先教你SQL整体优化、快速优化实施、如何读懂执行计划、如何左右执行计划这四大必杀招。整这些干嘛呢?答案是,传授一个先整体后局部的宏观解决思路,走进“道”的世界。 接下来带领大家飞翔在“术”的天空。教你体系结构、逻辑结构、表设计、索引设计、表连接这五大要领。这么多套路,这又是要干嘛?别,这是教你如何解决问题,准确地说,是如何不改写即完成SQL优化。 随后《收获,不止SQL优化——抓住SQL的本质》指引大家学会等价改写、过程包优化、高级SQL、分析函数、需求优化这些相关的五大神功。有点头晕,能否少一点套路?淡定,这还是“术”的范畴,依然是教你如何解决问题,只不过这次是如何改写SQL完成优化。 最后一个章节没套路了,其中跟随你多年的错误认识是否让你怀疑人生,其中让SQL跑得更慢的观点,是否让你三观尽毁? 再多一点真诚吧,《收获,不止SQL优化——抓住SQL的本质》提供扫二维码辅助学习,是不是心被笔者给暖到了? 读完全书,来,合上书本,闭上眼睛,深呼吸,用心来感受SQL优化的世界。 一个字:“爽”! 京东购买连接:https://item.jd.com/12191576.html

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧