1

2 つのテーブルを使用するビューを作成しようとしています。ここにいくつかの例を示しましたが、唯一の問題は、テーブルのサイズが異なる可能性があることです。

例:

表 A

    ID   COMPANY_ID FORM_JOURNAL_ID LIQ_GAS_BRAND RETAIL_PRICE WHOLE_SALE_PRICE
-------- ---------- --------------- ------------- ------------ ----------------
 11532        733             412           120        15601                0 
 11445        732             434           120           70                0  
 11440        730             412           120           10               15 

表 B

    ID COMPANY_ID FORM_JOURNAL_ID INDIVIDUALS   ENTITIES   COMPLEX
------ ---------- --------------- ----------- ---------- ------------------
 11911        730             412         555          0                777 
 11913        733             412           0        785                  0 
 11444        733             434          55          0                  0 

ご覧のとおり、テーブルは COMPANY_ID と FORM_JOURNAL_ID によってバインドされており、テーブル B には COMPANY_ID 733 と FORM_JOURNAL_ID 434 がありますが、テーブル A にはこれらの属性がありません。

すべての情報を表示するには、どのようなアプローチを使用する必要がありますか。つまり、テーブル A にテーブル B にある COMPANY_ID がない場合は、retail_price と whole_sale_price の場所に「0」を表示するだけです。

これまでのところ、両方のテーブルのデータを表示できるクエリを作成できましたが、各テーブルに特定の COMPANY_ID と FORM_JOURNAL_ID に関するデータが含まれている場合のみです。

完全なクエリ

FORM_JOURNAL_ID COMPANY_ID      RETAIL  WHOLESALE INDIVIDUALS   ENTITIES  COMPLEX
--------------- ---------- ----------- ---------- ----------- ---------- --------
        412        730          10         15         555          0        777 
        412        731          20          0          99          0      10001 
        412        733       15601          0           0        785          0 
        434        730          10          0           0          0          0 
        434        732          70          0           0          0          0 

        434        733           0          0          55          0          0

最後の行があるはずですが、そうではありません。

ありがとうございました!

p/s クエリ:

<!-- language: lang-sql -->
select
t1.form_journal_id,
t1.company_id,
max(nvl((decode(t1.liq_gas_brand, 120, t1.retail_price)),0)) as retail,
max(nvl((decode(t1.liq_gas_brand, 120, t1.whole_sale_price)),0)) as wholesale,
max(case when t2.form_journal_id = t1.form_journal_id and t2.company_id = t1.company_id then     nvl(t2.individuals, 0) else 0 end) as individuals,
max(case when t2.form_journal_id = t1.form_journal_id and t2.company_id = t1.company_id then nvl(t2.entities, 0) else 0 end) as entities,
max(case when t2.form_journal_id = t1.form_journal_id and t2.company_id = t1.company_id then nvl(t2.ind_energy_complex, 0) else 0 end) as complex
from cs_fact_f43_liq_gas t1, cs_form_journal j, cs_fact_f43_trade_gas t2
group by t1.form_journal_id, t1.company_id
order by t1.form_journal_id
4

1 に答える 1

1

結合先のテーブルにレコードがあるかどうかに関係なく、1 つのテーブルからすべてのレコードを取得するには、外部結合が必要です。これを行うには、レコードが欠落している可能性のある結合の側に (+) を追加します。ただし、上記の例を見ると、B にはないテーブル A のレコードがあり、その逆もあります。これには、完全な外部結合が必要です。これをオラクルで表現する簡潔な方法はわかりませんが、うまくいくはずの1つの方法は、両側で両方の方法で外部結合を使用してユニオンを使用することです。たとえば、これを試してください:

select a.FORM_JOURNAL_ID, 
       a.COMPANY_ID, 
       a.RETAIL_PRICE as RETAIL, 
       a.WHOLE_SALE_PRICE as WHOLESALE, 
       nvl(b.INDIVIDUALS,0) as INDIVIDUALS, 
       nvl(b.ENTITIES,0) as ENTITIES, 
       nvl(b.COMPLEX,0) as COMPLEX
  from TableA a, TableB b
 where a.FORM_JOURNAL_ID = b.FORM_JOURNAL_ID (+)
   and a.COMPANY_ID = b.COMPANY_ID (+)
union
select b.FORM_JOURNAL_ID, 
       b.COMPANY_ID, 
       nvl(a.RETAIL_PRICE,0) as RETAIL, 
       nvl(a.WHOLE_SALE_PRICE,0) as WHOLESALE, 
       b.INDIVIDUALS, 
       b.ENTITIES, 
       b.COMPLEX
  from TableA a, TableB b
 where b.FORM_JOURNAL_ID = a.FORM_JOURNAL_ID (+)
   and b.COMPANY_ID = a.COMPANY_ID (+);

nvl() 関数は、欠落しているデータが null になるだけなので、通常は必要ありませんが、ゼロを表示したいと言ったので、これらを含めました。

于 2013-09-03T06:17:05.903 に答える