避免产生笛卡尔积

在写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则不会产生重复。

你可能感兴趣的:(避免产生笛卡尔积)