【问题标题】:Why is a group by clause required when rows are limited in where clause?当行在 where 子句中受到限制时,为什么需要 group by 子句?
【发布时间】:2014-11-13 15:14:07
【问题描述】:

fiId 是 Table1 的主键。为什么此查询返回的行数与 table1 中的 fiId 一样多。 fiId 在 where 子句中被限制为 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 

【问题讨论】:

  • 您可能会争辩说,SELECT 子句中的每个非聚合表达式可以用作“隐式”GROUP BY 子句,但不幸的是,SQL 不是这样设计好了。
  • 您可以在查询中省略 GROUP BY - 只需将 SELECT 中的“Table1.fiId”替换为 76813
  • 显然这个查询只会返回 FiId = 76813 的行,但是内连接可能有多个记录与其他表中的 fiId 连接

标签: sql oracle


【解决方案1】:

如果在您的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 *"?

【讨论】:

  • 感谢您的回复。假设我们添加了一个 WHERE name = 'Joe'。我希望首先执行此操作,将 Joe 的所有产品留给我们,然后计数为 15。显然这不是它的工作方式。
  • 应该的。但是请记住,它将根据返回的结果进行计数。在您使用INNER JOINs 的示例中,没有GROUP BY,那么JOIN 结果中的任何额外记录都可能导致计数被丢弃。同样,GROUP BY 就是将聚合结果放入上下文中
猜你喜欢
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2022-12-14
  • 2011-02-16
  • 1970-01-01
  • 2018-03-23
  • 2020-05-02
相关资源
最近更新 更多