[Pgsql-ayuda] Full outer join

jtaaribi jtaaribi@terra.es
Mon, 22 Dec 2003 14:14:10 +0100


 Hola a todos,

 Quiero crear una consulta SQL para obtener los registros procedentes de la
unión de dos tablas, más los registros de la primera de ellas que no están
en la segunda y viceversa. Esto se obtiene con Full outer join. El problema
es que no quiero obtener todos los registros de ambas sino sólo los que
cumplen unas condiciones.

 Por ejemplo, las siguientes tablas:

 Tabla t1:

    num | col1 | col2
   -----+-----------
      1 |  a   |  1
      2 |  b   |  1
      3 |  c   |  2

 Tabla t2:

    num | col3 | col4
   -----+------------
      1 | xxx  |  5
      3 | yyy  |  6
      5 | zzz  |  5

 La consulta sería:

  select t1.num, t1.col1, t2.col3
  from t1 full outer join t2 on
       t1.num = t2.num and
       t1.col2 = 1 and
       t2.col4 = 5

 Para obtener:

  num | col1 | col3
 -----+------------
    1 |  a   | xxx
    2 |  b   | null
    5 | null | zzz

 Pero se produce un error: "FULL JOIN is only supported with mergejoinable
join conditions"

 El problema es que no permite limitar los campos de ninguna de las tablas.

 Se me han ocurrido dos formas para solucionarlo:

 select t1.num, t1.col1, t2.col3
  from t1 full outer join t2 on
       t1.num = t2.num
  where (t1.col2 = 1 and t2.col4 = 5) or
        (t1.col2 = 1 and t2.col4 is null) or
        (t1.col2 is null and t2.col4 = 5)

 O con la union de una left join más una right join.

 ¿Hay alguna otra alternativa? ¿Cual es la mejor forma de realizar lo que
quiero?

 Muchas gracias

 Saludos

 Iñaki