查看: 2459|回复: 10

[SQL] 【讨论】优化大虾速来围观啦

[复制链接]
认证徽章
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-11-5 19:07 | 显示全部楼层 |阅读模式
三张表结构及数据如下,表1记录柜子id,表2记录柜子上的箱子id和所在的柜子id,表3记录箱子存放的物品id和箱子id,三表第一列均为主键,第二列有普通索引
create table t1(h_id int);
create table t2(b_id int,h_id int);
create table t3(p_id int,b_id int);

insert into t1 values(1);
insert into t1 values(2);
insert into t1 values(3);
insert into t1 values(4);
insert into t2 values(10,1);
insert into t2 values(11,1);
insert into t2 values(20,2);
insert into t2 values(30,3);
insert into t2 values(31,3);
insert into t2 values(32,3);
insert into t2 values(33,3);
insert into t2 values(40,4);
insert into t2 values(41,4);
insert into t2 values(42,4);
insert into t3 values(100,10);
insert into t3 values(110,11);
insert into t3 values(300,30);
insert into t3 values(320,32);
insert into t3 values(330,33);
insert into t3 values(400,40);
insert into t3 values(410,41);
insert into t3 values(420,42);
insert into t3 values(101,10);
insert into t3 values(111,11);
insert into t3 values(201,20);
insert into t3 values(301,30);
insert into t3 values(321,32);
insert into t3 values(331,33);
insert into t3 values(401,40);
insert into t3 values(411,41);
insert into t3 values(421,42);
insert into t3 values(102,10);
insert into t3 values(112,11);
insert into t3 values(202,20);
insert into t3 values(302,30);
insert into t3 values(322,32);
insert into t3 values(332,33);
insert into t3 values(402,40);
insert into t3 values(422,42);
现在要统计每个柜子上存过物品的箱子总数和存过的物品总数,我的sql如下,大虾帮忙看看逻辑有没有问题,还有没有更好的写法呢?
select t4.* from (select t1.h_id,t.b,t.a from t1 left join
(select t2.h_id,count(distinct t2.b_id) a,count(distinct t3.p_id) b from t3 inner join t2 on t2.b_id=t3.b_id group by t2.h_id) t
on t1.h_id=t.h_id) t4 order by t4.h_id;
论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2014-11-5 21:28 | 显示全部楼层
为什么外层用left join,内层用inner join

使用道具 举报

回复
认证徽章
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
发表于 2014-11-5 22:24 | 显示全部楼层
试试这个:
select t2.h_id,count(distinct t2.b_id),count(distinct t3.p_id)
from t3 left  join t2 on t3.b_id=t2.b_id
group by t2.h_id

使用道具 举报

回复
论坛徽章:
526
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2014-11-5 22:51 | 显示全部楼层
楼上的第二列count(distinct t2.b_id)改成count(distinct t3.b_id)

使用道具 举报

回复
认证徽章
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
发表于 2014-11-5 23:01 | 显示全部楼层
newkid 发表于 2014-11-5 22:51
楼上的第二列count(distinct t2.b_id)改成count(distinct t3.b_id)

说得对,这样更严谨。

使用道具 举报

回复
认证徽章
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-11-7 11:35 | 显示全部楼层
bfc99 发表于 2014-11-5 22:24
试试这个:
select t2.h_id,count(distinct t2.b_id),count(distinct t3.p_id)
from t3 left  join t2 on ...

不用t1了? 有没存过东西的不是没记录了吗?  要统计所有的啊

使用道具 举报

回复
认证徽章
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-11-7 11:36 | 显示全部楼层
本帖最后由 fuiou_cary 于 2014-11-7 11:40 编辑
newkid 发表于 2014-11-5 22:51
楼上的第二列count(distinct t2.b_id)改成count(distinct t3.b_id)

使用道具 举报

回复
认证徽章
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
发表于 2014-11-7 11:41 | 显示全部楼层
fuiou_cary 发表于 2014-11-7 11:35
不用t1了? 有没存过东西的不是没记录了吗?  要统计所有的啊

T2表中不已经有了柜子的信息了吗,再关联T1表,多此一举了吧。

使用道具 举报

回复
认证徽章
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-11-7 12:43 | 显示全部楼层
bfc99 发表于 2014-11-7 11:41
T2表中不已经有了柜子的信息了吗,再关联T1表,多此一举了吧。

哦,那是我没说清楚,没用过的柜子更新了t1,是没有更新t2的,因为生产的时候还有很多其他列,是有新的包裹信息时才更新t2和t3

使用道具 举报

回复
认证徽章
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
发表于 2014-11-7 15:22 | 显示全部楼层
〇〇 发表于 2014-11-5 21:28
为什么外层用left join,内层用inner join

嗯   left join就可以了

使用道具 举报

回复

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

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年6月4日~6日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


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