0

我有三个表 t1,t2,t3。T3 与 t2 相关,t2 与 t1 相关。我有这个选择

select t1.id,sum(t3.column)
from 
    t1 
    join t2 on t2.fk = t1.id 
    join t3 on t3.fk = t2.id
where t1.column = 'something'
group by t1.id,t3.fk;

select without group by 有 120 行。和

group by t3.fk 

它有 5 行。和

group by t1.id it have 1 row

这还是可以的。但如果我有

group by t3.fk,t1.id

它有 5 行。我预计只有 1 行。示例数据:

t1.id    |t1.some_column
5        |"some data"

t2.id    |t2.fk    |t2.some_column
1        |5        |"a"
2        |5        |"b"
3        |5        |"c"
4        |5        |"d"
5        |5        |"e"

t3.id    |t3.fk    |t3.column
1        |1        |1
......................
24       |2        |1
......................
48       |3        |1
......................
72       |3        |1
......................
96       |3        |1
......................

选择返回:

t1.id    |sum(t3.column)
5        |24
5        |24
5        |24
5        |24
5        |24

当我按 t1.id 分组时,我不明白为什么有 5 行具有相同的 t1.id 。我知道如果它只返回一行,我会丢失有关 sum 的信息,但它也会在 select 中没有 sum 的情况下这样做。我知道这个选择很愚蠢而且没有意义,但它可能有助于我更好地理解。

4

1 回答 1

1

我相信您没有向我们提供足够的信息,因为结果毫无意义。

  • group by t2.fk返回 5 行表示有五个不同的t2.fk
  • group by t1.id返回 1 行意味着只有一个不同的t1.id值。
  • 由于您加入 on t2.fk = t1.id,这意味着不同值的t2.fk数量和不同值的数量t1.id应该相同,这与您之前的结果相矛盾。

对不起,你是对的。它应该是 t3.fk 而不是 t2.fk。我编辑它并添加一些数据。– CoCumis

没有什么难理解的。假设有 5 个唯一值,t3.fk例如 [1, 2, 3, 4, 5],和 1 个唯一值,t1.id例如 [1],组合t3.fk, t1.id应该产生 5 个唯一组合,例如 [(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]。因此返回 5 行符合预期。

于 2013-06-12T15:38:06.267 回答