2012-02-25 50 views
0

我已經審查了幾個網站和衆多的教程,試圖確定與我的情況最接近的匹配,雖然我找到許多類似的可能的解決方案,但沒有確切的解決方案給我我想要的東西。每次嘗試時,我都會返回不正確的數據,重複或無法返回所需的所有字段。任何援助非常感謝。謝謝,新手加入3 Oracle表的SQL語句

我有三個表,它們每個共享一個SUBR_ID的primary_key。從根本上說,我試圖從TBL_SUBR_INDV_CARRY_OVER中爲所有SUBR_ID和子INDV_ID(一對多)提取BENEFIT_CARRY_OVER,其中GRP_ID ='0G0000000',選擇名字,姓氏和用戶ID,個人ID以及利益結轉。下面是引用的三個表,並試圖嘗試聲明。

TBL_SUBR_INDV_CARRY_OVER: 
SUBR_ID 
INDV_ID 
BENEFIT_CARRY_OVER 

TBL_SUBR_GRP: 
SUBR_ID 
GRP_ID 

TBL_SUBR_INDV: 
SUBR_ID 
INDV_ID 
LNME 
FNME 

嘗試#1

select DISTINCT DCS2000.TBL_SUBR_GRP.SUBR_ID, DCS2000.TBL_SUBR_INDV.INDV_ID, LNME, FNME, GRP_ID, BENEFIT_YEAR, BENEFIT_CARRY_OVER 
from DCS2000.TBL_SUBR_INDV_CARRY_OVER, 
    DCS2000.TBL_SUBR_GRP, 
    DCS2000.TBL_SUBR_INDV 
where DCS2000.TBL_SUBR_INDV_CARRY_OVER.SUBR_ID = DCS2000.TBL_SUBR_INDV.SUBR_ID 
    and DCS2000.TBL_SUBR_INDV.SUBR_ID = DCS2000.TBL_SUBR_GRP.SUBR_ID 
    and DCS2000.TBL_SUBR_GRP.GRP_ID = '0G0000000' 
    and DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_CARRY_OVER > '0' 

嘗試#2

select DCS2000.TBL_SUBR_INDV.SUBR_ID, DCS2000.TBL_SUBR_INDV.INDV_ID, DCS2000.TBL_SUBR_INDV.LNME, DCS2000.TBL_SUBR_INDV.FNME, DCS2000.TBL_SUBR_GRP.GRP_ID, DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_YEAR, DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_CARRY_OVER 
from DCS2000.TBL_SUBR_INDV 
join DCS2000.TBL_SUBR_GRP on ( 
    where DCS2000.TBL_SUBR_INDV_CARRY_OVER.SUBR_ID = DCS2000.TBL_SUBR_INDV.SUBR_ID 
    and DCS2000.TBL_SUBR_INDV.SUBR_ID = DCS2000.TBL_SUBR_GRP.SUBR_ID 
    and DCS2000.TBL_SUBR_GRP.GRP_ID = '0G0000000' 
    and DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_CARRY_OVER > '0' 

嘗試3

SELECT LNME, FNME, SUBR_ID, INDV_ID 
FROM DCS2000.TBL_SUBR_INDV 
WHERE DCS2000.TBL_SUBR_INDV.SUBR_ID IN 
     (SELECT BENEFIT_CARRY_OVER 
     FROM DCS2000.TBL_SUBR_INDV_CARRY_OVER 
     WHERE DCS2000.TBL_SUBR_INDV_CARRY_OVER.SUBR_ID IN 
      (SELECT SUBR_ID 
      FROM DCS2000.TBL_SUBR_GRP 
      WHERE DCS2000.TBL_SUBR_GRP.GRP_ID = '0G0000000') 
    ) 
+0

對於carry-over表,是benefit_year,並且您想在查詢結果中看到它嗎? – 2012-02-25 08:51:00

回答

0

的問題是,由於一對多,一個簡單的所有三個表的連接將會產生重複的行對於您感興趣的數據。連接必須爲連接在一起的每一行創建一整行。而你想要的是單排。

我經常發現,要建立一個複雜的查詢,最好在部分

這樣做,首先要找到所有感興趣的值的ID,用單排的每個。由於我使用的鍵盤,我會縮短名稱。

選擇從subrgrp不同subr_id其中GRPID = 0000006

然後結合此與下一個表達

選擇從subrindv不同indvid其中subrid在(從subrgrp選擇不同subr_id其中GRPID = 0000006)

然後選擇感興趣的最後一行。

從subrindv選擇夾帶其中indvid在(選擇從subrindv不同indvid其中subrid在(選擇從subrgrp不同subr_id其中GRPID = 0000006))

的替代方法是使用GROUP BY將多個行成一個。

1

我假設重複的發生是因爲一個人可以有很多遺留記錄。因此,嘗試:

select i.SUBR_ID, 
     i.INDV_ID, 
     max(i.LNME) LNME, 
     max(i.FNME) FNME, 
     max(g.GRP_ID) GRP_ID, 
     o.BENEFIT_YEAR, 
     sum(o.BENEFIT_CARRY_OVER) BENEFIT_CARRY_OVER 
from DCS2000.TBL_SUBR_GRP g 
join DCS2000.TBL_SUBR_INDV i 
    on g.SUBR_ID = i.SUBR_ID 
join DCS2000.TBL_SUBR_INDV_CARRY_OVER o 
    on i.SUBR_ID = o.SUBR_ID and i.INDV_ID = o.INDV_ID and o.BENEFIT_CARRY_OVER > 0 
where g.GRP_ID = '0G0000000' 
group by i.SUBR_ID, 
     i.INDV_ID, 
     o.BENEFIT_YEAR 

注意,單個表需要由訂戶個別ID二者接合到結轉表;此外,數字字段(如BENEFIT_CARRY_OVER)不應在其值附近引號。

+0

這工作完美。我能夠驗證每個人的總數作比較。謝謝你的時間! – 2012-02-27 15:40:20