代码之家  ›  专栏  ›  技术社区  ›  Wadih M.

带多级联接的SQL SUM()。

sql
  •  0
  • Wadih M.  · 技术社区  · 15 年前

    假设我有下表关系(通过两端已有的键)

    table a -> table b
    table b -> table c
    table c -> table d
    table d -> table e
    table e -> table f
    

    我想按一个键分组 table a 和sum()的值来自 table f 好像两个表都是直接联接的。

    问题是,如果我这样做,信息将被复制,因为来自a->b->c->d->e->f的所有关系都将重复(正如Andomar所说:某些信息重复,因为a到f有多个路由)

    有没有办法解决这个问题,或者我唯一的选择是创建一个包含 表A -gt; 表F 关系?

    细节:

    Table a
    id1 | id2
    
    Table b
    id2 | id3
    
    Table c
    id3 | value
    
    select a.id1, sum(value) from a 
    inner join b on a.id2 = b.id2
    inner join c on b.id3 = c.id3
    group by a.id1
    

    数据示例:

    进行连接时,关系是:

    a b c value
    1 2 2 20
    1 3 2 20
    1 4 2 20
    

    如果我做sum(),我会得到60,但我想得到20

    谢谢

    1 回复  |  直到 15 年前
        1
  •  1
  •   Andomar    15 年前

    我假设某些信息重复,因为有多个从A到F的路由。如果在F中有一个唯一的键,则可以使用子查询取消复制路由:

    SELECT  SubQuery.AValue, sum(SubQuery.FValue)
    FROM    (
            SELECT a.value as AValue, f.key, f.value as FValue
            FROM a
            INNER JOIN b ON b.key = a.key
            INNER JOIN c ON c.key = b.key
            INNER JOIN d ON d.key = c.key
            INNER JOIN e ON e.key = d.key
            INNER JOIN f ON f.key = e.key
            GROUP BY a.value, f.key, f.value
            ) as SubQuery
    GROUP BY SubQuery.AValue
    

    子查询确保f中的每一行只计算一次。