1

我正在尝试创建一个使用两个表的视图。我在这里看到了一些示例,但唯一有问题的部分是我的表可以有不同的大小:

例子:

表 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

要从一个表中获取所有记录,无论它们是否在您要加入的表中,都需要外部联接。为此,您只需将 (+) 添加到可能缺少记录的连接一侧。但是,查看上面的示例,您可以在表 A 中找到不在 B 中的记录,反之亦然。为此,您将需要一个完整的外部联接。我不知道在 oracle 中表达这一点的简洁方法,但一种可行的方法是在每一侧都使用带有外部连接的联合,例如试试这个:

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() 函数,因为任何丢失的数据都会为空,但我已经包括了这些,因为你提到你想显示零。

于 2013-09-03T06:17:05.903 回答