Postgresql Full Outer加入2个表

时间:2014-09-23 20:38:41

标签: sql postgresql outer-join

表格结构:

tb_participante_respuesta

ID | n_varcod | n_parcod | c_resval 
1  |   48     |    1     |   'PRT' 
2  |   48     |    2     |   'ZDE' 

tb_encuesta_valor

ID | n_varcod | c_valnom | n_valord
1  |   48     |   'ART'  |    1
2  |   48     |   'PRT'  |    2
3  |   48     |   'ZDE'  |    3

我执行此查询:

select a.n_parcod,b.c_valnom ,a.c_resval
from tb_participante_respuesta a
full outer join tb_encuesta_valor b on b.n_varcod=a.n_varcod
                                   and b.c_valnom=a.c_resval
where b.n_varcod=48
order by b.n_valord;

输出:

n_parcod | c_valnom | c_resval
  Null   |   'ART'  |  Null
    1    |   'PRT'  |  'PRT'
  Null   |   'ZDE'  |  Null

我想要这样的事情:

n_parcod | c_valnom | c_resval
     1   |   'ART'  |  Null
     1   |   'PRT'  |  'PRT'
     1   |   'ZDE'  |  Null
     2   |   'ART'  |  Null
     2   |   'PRT'  |  Null
     2   |   'ZDE'  |  'ZDE'

1 个答案:

答案 0 :(得分:1)

cross join会做一个笛卡尔积。然后,您需要单独检查匹配条件。

select
    p.n_parcod,
    e.c_valnom,
    case when 
            p.c_resval = e.c_valnom and 
            e.n_varcod = p.n_varcod 
        then p.c_resval 
    end as c_resval
from
    tb_encuesta_valor e
        cross join
    tb_participante_respuesta p
where
    e.n_varcod = 48
order by
    p.n_parcod, 
    e.n_valord;

Example SQLFiddle