2014-09-23 3 views
-1

Таблица структуры:Postgresql полное внешнее соединение 2 таблицы

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' 
+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

+0

Спасибо, я не знал о перекрестном соединении. – user2876735

Смежные вопросы