比较没有group by子句的两个聚合函数

时间:2013-10-09 17:17:10

标签: sql oracle

假设我们有3个表,第1个表是主表,下面是详细信息

  

MasterTable(ID,COL1,COL2)

     

ChildTable1(ID,MasterId,Amount1)

     

ChildTable2(ID,MasterId,AMOUNT2)

我必须找到来自mastertable的ID sum(chiletable1.Amount1)应大于sum(chiletable2.Amount2)

我已经使用groupby和having子句编写了查询,该子句提供了正确的数据,

有没有其他方法可以在没有groupby的情况下编写相同的查询,如果表中有大量的记录,请记住性能问题。 以下是我的查询

    select Mastertable.Id 
           from Mastertable,Childtable1,ChildTable2
           where Mastertable.Id=Childtable1.MasterId
                 and ChildTable1.MasterId=ChildTable2.MasterId
                 group by MasterTable.Id
                 having SUM(Childtable1.Amount1) > SUM(Childtable2.Amount2)

2 个答案:

答案 0 :(得分:1)

要回答您的问题,

原因很简单:如果没有GROUP BY,则无法拥有SUM()。 (除了总计)

编辑:好吧,也许是一个包含循环,游标等的存储过程,但是 肯定是一种矫枉过正的行为!;)

答案 1 :(得分:0)

好吧,你将不得不在某些点进行分组,所以我不知道为什么你根本不想分组。

您可以尝试按子表中的ID进行分组:

SELECT M.Id
FROM Mastertable M
INNER JOIN (SELECT MasterID, 
                   SUM(Amount) Amount 
            FROM Childtable1 
            GROUP BY MasterID) C1
    ON M.Id = C1.MasterID
INNER JOIN (SELECT MasterID, 
                   SUM(Amount) Amount 
            FROM Childtable2 
            GROUP BY MasterID) C2
    ON M.Id = C2.MasterID
WHERE C1.Amount > C2.Amount

如果子表中有外键返回MasterTableMasterID上的索引,这可能是没有通过快照或其他方法预先聚合的最快方法。 / p>