【发布时间】:2012-01-26 19:16:41
【问题描述】:
我有如下查询
SELECT a.*, b.*
(SELECT ATTR1, ATTR2, sum(QUANTITY) AS TOTAL_QTY,
ATTR3 FROM TABLE_A
WHERE ATTR4 > 0
GROUP BY ATTR1, ATTR2, ATTR3) a,
TABLE_B b
WHERE a.ATTR1 = b.ATTR1
AND a.ATTR2 = b.ATTR2
我只需要GROUP BY ATTR1 来计算正确的TOTAL_QTY,但我将其他属性分组的唯一原因是因为Oracle 要求如果存在GROUP BY 子句,那么所有SELECT 属性都应该在GROUP BY 子句也是如此。
这意味着每次我需要来自 Table_A 的此查询中的属性时,我也需要将其放入 GROUP BY 中。这不仅看起来难看,而且可能会对性能产生影响,甚至可能产生无法预料的副作用。
如何重写上述查询以计算每个ATTR1 组中的TOTAL_QTY,而不使用GROUP BY 子句?
【问题讨论】:
-
这是聚合的本质,你必须分组,否则系统不知道你想要总计什么或如何形成行。消除这种影响的唯一方法是在其他列 max(attr1)、max(attr2) 上使用聚合,但是您很快就会明白为什么如果 attr1 和 attr2 在不同的行中具有不同的值,group by 是更好的选择同一列
-
"Oracle 要求如果存在 GROUP BY 子句,那么所有 SELECT 属性也应该在 GROUP BY 子句中。"不正确 - 它们也可以聚合;如果对于所需分组项的给定值,其他值将始终保持不变,则可以使用诸如 MAX 之类的函数。
-
您要查找的内容不明确。假设您有两行,
attr1的值相同,attr2的值不同。在这种情况下,您希望结果集是什么样的? -
@DaveCosta 在这种情况下,其中任何一个都可以。实际上在我的情况下,如果
attr1是其他表的 FK。如果它出现多次,那么它们基本上都指向另一个表中的一行。 Table_a 记录每个实例的单独数量值。我只是想从 Table_a 中获取汇总信息和其他一些常见信息。
标签: sql oracle group-by aggregate-functions