oracle group由多个表连接

时间:2012-07-07 16:39:25

标签: sql oracle

我的表格有以下设计: -


Table A 
--------------------------
subCatId | catId | catDesc
--------------------------
   1     |  3    |  100
   2     |  3    |  100
   3     |  5    |  100
   4     |  5    |  100
   5     |       |  100

Table B
--------------------------
subCatId | amount 
--------------------------
   1     |  10
   2     |  20
   3     |   5
   4     |  15
   5     |    

第三个表,即表AB,是要插入记录的表。在上面的表格的基础上,查询应该:  1.检查表AB,是否存在任何subCatId。  2.如果表格为空,则获取所有subCatId& catId出现在表A中,其中catDesc = 100并且基于表A的subCatId获取表B的数量。


Table AB
--------------------------
subCatId | catId | amount
--------------------------
   1     |  3    |  10
   2     |  3    |  20
   3     |  5    |  35       
   4     |  5    |  15
   5     |       |  50       

正如您在上面的表AB中看到的subCatId 1& 2 catId为3,因此1&的金额值为1。 2应该总结并显示subCatId 3(包括表B中已经存在的金额值5)。类似地,对于subCatId 5,金额值应该从subCatId 3& 4。

如果有人能帮助我获得如上所示TableAB的预期结果,我将非常感激。

我已经单独尝试了以下查询

SELECT A.CATID, SUM(B.AMOUNT) 
FROM A LEFT OUTER JOIN B 
           ON A.SUBCATID = B.SUBCATID 
WHERE A.CATDESC=100
  AND A.SUBCATID NOT IN 
          (SELECT AB.SUBCATID FROM AB) 
GROUP BY CATID;

但是,它只提供catid和总金额值,但我找不到获得subCatId及其各自金额的方法。请帮忙......谢谢。应用左外连接的原因是,如果表B中不存在subCatId,但它存在于表A中,那么它也应该与结果一起显示。

1 个答案:

答案 0 :(得分:1)

这种解释很接近,但并不能得到你想要的东西。

首先,从金额的基表开始:

select a.subcatid, a.catid, b.amount
from (select *
      from A
      where a.catdesc = 100
     ) A left outer join
     B
     on a.subcatid = b.subcatid left outer join
     AB
     on a.subcatid = ab.subcatid and a.catid = b.catid
where ab.subcatid is null

接下来,您希望在此处获取金额并添加catid等于subcat id的所有金额。要做到这一点,我们需要一个自我加入。我将使用with语法将其定义为别名:

with t as (
     select a.subcatid, a.catid, b.amount
     from (select *
           from A
           where a.catdesc = 100
          ) A left outer join
          B
          on a.subcatid = b.subcatid left outer join
          AB
          on a.subcatid = ab.subcatid and a.catid = b.catid
     where ab.subcatid is null
)
select t.subcatid, t.catid,
       (t.amount + coalesce(tcat.amount, 0)) as amount
from t left outer join
     (select catid, sum(amount) as amount
      from t
      group by catid
     ) tcat
     on t.subcatid = t.cat

问题在于,它总计了基本金额,但不计算中间总计。因此,“5”的总数包括“3”和“4”的基数,但不包括它们下面的小计。

要获得完整的解决方案,您似乎需要两件事之一。构建一个循环以逐行遍历表,使用更新和查询来获取所需内容。或者,我认为Oracle具有“connect by”语句,该语句允许沿树结构进行查询。不幸的是,我不太清楚它产生正确的SQL。或者,如果树结构不太深 - 例如在您的示例中 - 那么您可以手动遍历一个或两个级别,如果这足够的话。