2014-09-23 84 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

無PG版,沒有解釋,含糊不清的數據,破格式。 – 2014-09-23 22:14:40

回答

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 2014-09-24 03:24:27