为什么在where子句中限制行时需要group by子句?

时间:2014-11-13 15:14:07

标签: sql oracle

fiId是Table1的主键。为什么此查询返回的行数与table1中的fiId一样多。在where子句中,fiId被限制为1行。添加Table1.fiId的组时,查询会正常执行,当然不应该这样做吗?感谢。

SELECT                                                                                                           
        Table1.fiId,                                                                       
        SUM(CASE Table2.type IN (4,7)  THEN Table2.valueToSum  ELSE 0 END),
FROM
        Table1 INNER JOIN Table3 ON Table1.fiId = Table3.parentId
               INNER JOIN Table2  ON Table2.leId = Table3.fiId 
WHERE
        Table1.fiId = 76813  AND
        Table2.insId = 431144 

1 个答案:

答案 0 :(得分:2)

SELECT中使用汇总功能时,如SUMCOUNT选择其他列时,还需要包含这些附加列的GROUP BY。虽然我不知道背后的确切原因,但将结果置于上下文中肯定会有所帮助。

考虑以下问题:

SELECT Name, Count(Product) as NumOrders
FROM CustomerOrders
GROUP BY Name

在这里,我们假设我们将得到如下结果:

Name     NumOrders
------------------
Joe      15
Sally    5
Jim      23

现在,如果SQL不需要GROUP BY,那么您对输出的期望是什么?我最好的猜测是这样的:

Name     NumOrders
------------------
Joe      43
Sally    43
Jim      43

在这种情况下,虽然表格中实际上可能有43个订单记录,但Name并未真正提供任何有用的数据。相反,我们只是有一堆脱离背景的名字。

有关详情,请参阅此处的类似问题:Why do I need to explicitly specify all columns in a SQL "GROUP BY" clause - why not "GROUP BY *"?