一个视图使用两个表,数据可能不在两个表中,Oracle SQL

时间:2013-09-03 05:49:07

标签: sql oracle

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

示例:

表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

1 个答案:

答案 0 :(得分: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()函数,因为任何丢失的数据都只是null,但是我已经提到了你想要显示零的这些函数。