如何用两个表连接同一个表?

时间:2018-01-25 07:50:50

标签: sql oracle

我想创建一个Oracle数据库视图:

create or replace force view view_ind_pta (indi_code, nat_indi_code, indi_unite, indi_symbole, indi_lib, indi_cible, pta_intitule, indi_resp, 
indi_source_info, user_code, peri_mes_code, peri_mes_lib, pta_parent, deleted,obj_intitule,pta_action) 
as 
select distinct
i.indi_code,
i.nat_indi_code,
i.indi_unite,
i.indi_symbole,
to_char(i.indi_lib) as indi_lib,
i.indi_cible,
concat(concat(to_char(a.pta_ref),' - '),to_char(a.pta_intitule)) as pta_intitule,
i.indi_resp,
to_char(i.indi_source_info) as indi_source_info,
u.user_code,
i.peri_mes_code , 
pm.peri_mes_lib ,
concat(concat(to_char(p.pta_ref),' - '),to_char(p.pta_intitule)) as pta_parent,
i.deleted ,
to_char(o.obj_intitule) as obj_intitule,
concat(concat(to_char(action.pta_ref),' - '),to_char(action.pta_intitule)) as pta_action
from
indicateur i
left join acteur_saisie_indicateur ai on ai.indi_code = i.indi_code
left join acteur_verif_indicateur avi on avi.indi_code = i.indi_code
left join utilisateur u on ( ai.user_code = u.user_code and avi.user_code = u.user_code) 
left join objectif o on i.obj_code = o.obj_code
left join pta a on o.pta_code = a.pta_code
left join pta action on a.pta_pta_code = action.pta_code
left join pta p on action.pta_pta_code = p.pta_code 
left join periodicite_mesure pm on pm.peri_mes_code = i.peri_mes_code
where p.pta_definitif = 3;

在视图中有一个表 utilisateur ,我想加入两个表 acteur_saisie_indicateur acteur_verif_indicateur 。我尝试了and运算符,但我认为这不是一个好主意,因为只有当两个表中都有连接的行时,查询才会返回行!虽然这不是必需的:我希望查询返回行,即使只有一个表已加入行。那么如何加入这三个表?

2 个答案:

答案 0 :(得分:1)

您需要加入桌子两次:<​​/ p>

left join acteur_saisie_indicateur ai on ai.indi_code = i.indi_code
left join acteur_verif_indicateur avi on avi.indi_code = i.indi_code
left join utilisateur u on ai.user_code = u.user_code 
left join utilisateur u2 on avi.user_code = u2.user_code

答案 1 :(得分:1)

我们可以在FROM子句中多次包含同一个表。我们需要做的就是使用不同的别名来区分实例:

left join utilisateur uai 
    on ai.user_code = uai.user_code
left join utilisateur uavi 
    on avi.user_code = uavi.user_code

您需要做的另一件事是在视图的投影中处理表格的列。您希望显示utilisateur值,无论值来自哪个实例,例如使用nvl()或行业标准coalesce()

coalesce(uai.user_code, uavi.user_code) as user_code