在写SQL的时候,复杂到一定程度不可避免的会出现多个连结,此时特别容易产生笛卡尔积。若外层的聚合函数是count(distinct col)类型,倒没有关系,因为已经去重了。但若外层的聚合函数是sum类型的,那么就会产生重复计算。
解决办法就是:在脑袋里构思,形成新的主键,并将新的主键应用到on的条件中。
保证每一次连结都到了最细粒度上。
例如: deal和poi是 * ——*的映射关系,在join 交易表时,条件则不能只写deal,加设1个deal有4个poi,通过交易表已经得出了这个deal的交易额。因为deal在表中有4条记录,分别对应4个poi,再在外层sum交易额, 则会计算4倍deal的交易额。
解决办法是,join on的条件同时锁定 Deal和poi 这样计算的交易额是每个deal在每个poi的交易额,没有重复的情况。在外层sum则不会产生重复。
避免产生笛卡尔积
最后编辑于 :
?著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- //Clojure入门教程: Clojure – Functional Programming for the J...
- SQL语言基础 本章,我们将会重点探讨SQL语言基础,学习用SQL进行数据库的基本数据查询操作。另外请注意本章的S...