2012-03-15 10 views
3

次の問題があります。私は現在、データベース内のさまざまなテーブルから情報を返そうとしています。このプロセスでは、システムにアクティビティが追加され、理論的には特定のタイプの合意が必要です。しかし、時には活動に期待される合意がない場合もあります。私はこれがどこにあるかを特定したいと思います。ORACLE SQL結合への参加に関するクエリ

私は現在、(実際のクエリから簡体字)、次のようになり、データを返します(下図参照)クエリを持っています。データがどのように見えるか

ID Activity Agreement  Agreement Type 
1 X   Budgets  Payment 
2 X 
3 X   Budgets 

は次のとおりです。

ID Activity Agreement  Agreement Type 
1 X   Budgets  Payment 
2 X 
3 X   

基本的に、合意タイプの支払いがない場合、私は契約を表示することを望んでいません(でも私はまだその活動を見たいと思っています)。 IDはアクティビティを契約に参加させるために使用されますが、契約および契約タイプは、説明IDで結合された別個のテーブルからのものです。

SELECT O_ACTIVITIES.ACT_SUBJECT_ID as "ID", 
     initcap(olm_bo.get_per_name(O_ACTIVITIES.ACT_SUBJECT_ID)) as "Name", 
     O_ACTIVITIES.ACT_ID as "Activity ID", 
     initcap(O_ACTIVITY_TYPES.ACT_DESC) as "Activity Type", 
     O_ACTIVITIES.ACT_REQUESTED_DATE as "Start Date", 
     case when olm_bo.get_ref_desc(O_ACTIVITIES.ACT_STATUS,'ACTIVITY_STATUS') = 'Newly generated' 
        then null 
        else O_ACTIVITIES.ACT_STATUS_DATE 
      end as "End Date", 
     olm_bo.get_ref_desc(O_ACTIVITIES.ACT_STATUS,'ACTIVITY_STATUS') as "Status", 
     O_ACTIVITIES.ACT_CREATED_BY as "Created by", 
     O_AGREEMENT_DETAILS.ADE_ID as "Agreement ID", 
     initcap(olm_bo.get_sty_name(O_AGREEMENT_DETAILS.ADE_STY_ID)) as "Service Type", 
     initcap(olm_bo.get_sty_name(O_SERVICE_ELEMENTS.SEL_STY_CHILD_ID)) as "Service Element", 
     O_AGREEMENT_DETAILS.ADE_START_DATE as "Agreement Start", 
     O_AGREEMENT_DETAILS.ADE_END_DATE as "Agreement End", 
     O_AGREEMENT_DETAILS.ADE_ENTERED_BY as "Entered by" 
FROM O_ACTIVITIES 
LEFT JOIN O_ACTIVITY_TYPES 
     ON O_ACTIVITY_TYPES.ACT_CLASS= O_ACTIVITIES.ACT_CLASS and 
      O_ACTIVITY_TYPES.ACT_TYPE=O_ACTIVITIES.ACT_TYPE AND 
      initcap(O_ACTIVITY_TYPES.ACT_DESC) = 'X' 
LEFT OUTER JOIN O_AGREEMENT_DETAILS 
     ON O_AGREEMENT_DETAILS.ADE_SUBJECT_ID=O_ACTIVITIES.ACT_SUBJECT_ID AND 
      initcap(olm_bo.get_sty_name(O_AGREEMENT_DETAILS.ADE_STY_ID)) IN ('Budgets') AND 
      O_AGREEMENT_DETAILS.ADE_START_DATE >= O_ACTIVITIES.ACT_REQUESTED_DATE 
LEFT JOIN O_SERVICE_ELEMENTS 
     ON O_AGREEMENT_DETAILS.ADE_SEL_ID=O_SERVICE_ELEMENTS.SEL_ID AND 
      initcap(olm_bo.get_sty_name(O_SERVICE_ELEMENTS.SEL_STY_CHILD_ID)) IN ('Payment') 
WHERE (O_ACTIVITIES.ACT_SYSTEM_IND IS NULL and 
     NVL(O_ACTIVITIES.ACT_REC_TYPE,'???') NOT IN ('Y') ) AND 
     initcap(O_ACTIVITY_TYPES.ACT_DESC) = 'X' 

問題は、契約タイプの説明を含むサービス要素テーブルが契約テーブルから分離されていることです。私は契約タイプコード(実際に契約タイプに合意テーブルに加わる)を使用することができましたが、本当に私は合意テーブルと合意タイプテーブルにインナージョイントを達成できるかどうかを知りたいだけですアクティビティテーブル。

指針やアドバイスをいただければ幸いですが、十分に説明しました。

答えて

1

試してみてください。

SELECT O_ACTIVITIES.ACT_SUBJECT_ID as "ID", 
     initcap(olm_bo.get_per_name(O_ACTIVITIES.ACT_SUBJECT_ID)) as "Name", 
     O_ACTIVITIES.ACT_ID as "Activity ID", 
     initcap(O_ACTIVITY_TYPES.ACT_DESC) as "Activity Type", 
     O_ACTIVITIES.ACT_REQUESTED_DATE as "Start Date", 
     case when olm_bo.get_ref_desc(O_ACTIVITIES.ACT_STATUS,'ACTIVITY_STATUS') = 'Newly generated' 
        then null 
        else O_ACTIVITIES.ACT_STATUS_DATE 
      end as "End Date", 
     olm_bo.get_ref_desc(O_ACTIVITIES.ACT_STATUS,'ACTIVITY_STATUS') as "Status", 
     O_ACTIVITIES.ACT_CREATED_BY as "Created by", 
     O_AGREEMENT_DETAILS.ADE_ID as "Agreement ID", 
     initcap(olm_bo.get_sty_name(O_AGREEMENT_DETAILS.ADE_STY_ID)) as "Service Type", 
     initcap(olm_bo.get_sty_name(O_SERVICE_ELEMENTS.SEL_STY_CHILD_ID)) as "Service Element", 
     O_AGREEMENT_DETAILS.ADE_START_DATE as "Agreement Start", 
     O_AGREEMENT_DETAILS.ADE_END_DATE as "Agreement End", 
     O_AGREEMENT_DETAILS.ADE_ENTERED_BY as "Entered by" 
FROM O_ACTIVITIES 
LEFT JOIN O_ACTIVITY_TYPES 
     ON O_ACTIVITY_TYPES.ACT_CLASS= O_ACTIVITIES.ACT_CLASS and 
      O_ACTIVITY_TYPES.ACT_TYPE=O_ACTIVITIES.ACT_TYPE AND 
      initcap(O_ACTIVITY_TYPES.ACT_DESC) = 'X' 
LEFT JOIN O_AGREEMENT_DETAILS 
      JOIN O_SERVICE_ELEMENTS 
      ON O_AGREEMENT_DETAILS.ADE_SEL_ID=O_SERVICE_ELEMENTS.SEL_ID AND 
       initcap(olm_bo.get_sty_name(O_SERVICE_ELEMENTS.SEL_STY_CHILD_ID)) IN ('Payment') 
     ON O_AGREEMENT_DETAILS.ADE_SUBJECT_ID=O_ACTIVITIES.ACT_SUBJECT_ID AND 
      initcap(olm_bo.get_sty_name(O_AGREEMENT_DETAILS.ADE_STY_ID)) IN ('Budgets') AND 
      O_AGREEMENT_DETAILS.ADE_START_DATE >= O_ACTIVITIES.ACT_REQUESTED_DATE 
WHERE (O_ACTIVITIES.ACT_SYSTEM_IND IS NULL and 
     NVL(O_ACTIVITIES.ACT_REC_TYPE,'???') NOT IN ('Y') ) AND 
     initcap(O_ACTIVITY_TYPES.ACT_DESC) = 'X' 
+0

もう一度、それは私が望んでいたことを正確にしています。私はあなたが2つの左の結合を結合したことを確認します。私は決してそのようにすることを考えなかったでしょう。ありがとうございます。 – bawpie

1

最も簡単な方法(これは1つのモンスターSQLであるため)は、それを包み込み、case文を使用します。それはを通してあなたの方法を選ぶよりも簡単であるよう

SELECT ID, Activity, Case When Agreement_Type IS NULL THEN NULL ELSE Agreement END, Agreement_Type 
FROM 
(All the original SQL goes in here) 

だから基本的にあなたの最初のSQLの全体の周りに別のSQLを実行し、ところでそれは私が_でを使用しましたので、あなたの列名にスペースを避けるために、常に良い考えですこの場合。

+0

おかげで、私は私は実際に(以下MBのソリューションを参照してください)最初の場所に戻ってくるからそれらを停止するために、より良い練習だろうと思った、しかし、これらの線に沿って何かを考えてみました。 – bawpie

+0

@bawpie Fair pointは、テーブル名のエイリアシングにも価値がありますが、これによってSQLのサイズが大幅に縮小されるはずです。オラクルの結合も「Left」ではなく「+」で作業する方が簡単です。 –

関連する問題