2012-07-07 36 views
1

我有我的表的下方設計: -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.如果該表爲空,則獲取catDes表中存在catDesc = 100且基於表A的subCatId的表B的數量的所有subCatId & catId。


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 & 2應總結並示出了用於subCatId 3(包括量值5,其已經是量的值在表B中)。相似地,對於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中,那麼它也應該與結果一起顯示。

+0

我已經單獨嘗試了下面的查詢「SELECT A.CATID,SUM(B.AMOUNT)FROM 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和總金額值,但我無法找到獲得子金額及其各自金額的方法。請幫助...謝謝。應用左外連接的原因是,如果表B中不存在subCatId,但它存在於表A中,那麼它也應該與結果一起顯示。 – SteveM 2012-07-07 16:53:17

回答

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 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」的基數,但不包括它們下面的小計。

爲了獲得完整的解決方案,您似乎需要兩件事之一。要麼建立一個循環來逐行瀏覽表格,使用更新和查詢來獲得你所需要的。或者,我認爲甲骨文有「connect by」語句,它允許沿着樹結構進行查詢。不幸的是,我不太清楚產生正確的SQL。或者,如果樹結構不太深 - 比如在你的例子中 - 那麼你可以手動遍歷一個或兩個級別,如果這足夠的話。

+0

感謝Gordon的回答。我已經得到了你所提到的結果。你是對的,我必須逐行循環遍歷表格,以便更新總量。我相信它只是我留下的最佳解決方案。再次感謝您的指導。 – SteveM 2012-07-09 14:18:25