2012-02-25 14 views
0

私は、自分の状況に最も近いものを判断しようとしているいくつかのサイトと多数のチュートリアルを見直しました。それぞれの試みで、私は間違ったデータを返すか、重複したり、必要なすべてのフィールドを返すことができなかった。どんな支援も大歓迎です。ありがとう、初心者3つのOracleテーブルを結合するSQLステートメント

私は3つのテーブルを持って、彼らはそれぞれSUBR_IDのprimary_keyを共有します。レイの言葉では、私はTBL_SUBR_INDV_CARRY_OVERからすべてのSUBR_IDとサブINDV_ID(1対多)からBENEFIT_CARRY_OVERを抽出しようとしています。GRP_ID = '0G0000000'の場合、姓、名、加入者ID、個人ID、 。以下は、参照されている3つのテーブルと、試行された文の試行です。

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

キャリーオーバーテーブルのbenefit_yearは、クエリ結果に表示しますか? –

答えて

0

問題は、その原因の多くの1つに、単純です3つのテーブル全体で結合すると、重複する行が得られます関心のあるデータについては、ジョインは結合されたすべての行に対して行全体を作成する必要があります。一方、あなたが望むのは一行です。私は、多くの場合、それが複雑なクエリを構築するために見つける

は最高のそれぞれの単一の行で、目的の値を含むすべてのIDを見つけることが最初、部品だから、

で行われます。それは私が使用しているキーボードのためにいくぶん名前を短縮します。

そして(ここGRPID = 0000006 subrgrpから別個subr_idを選択)

にsubrindv場合subridから別個indvidを選択アップ

次のテーブルと組み合わせるGRPID = 0000006

subrgrpから別個subr_idを選択

次に、最後の行を選択します。 subrindvから

選択キャリーオーバーここでindvid(subrindvは異なるindvidを選択する場合にsubrid(GRPID = 0000006)subrgrp区別subr_id選択)

別の一つにグループ複数行にGROUP BYを使用することであるが。

1

私は、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

これは完全に機能しました。私は比較のためにそれぞれの個別の合計を検証することができました。ありがとうございました! –

関連する問題