我正在尝试创建一个使用两个表的视图。我看过这里展示的一些例子,但唯一有问题的部分是我的表格大小不同:
示例:
表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
答案 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,但是我已经提到了你想要显示零的这些函数。