RE: [Pgsql-ayuda] Full join de tres tablas

From: "Rafael Vigata" <rvigata(at)sipec(dot)es>
To: "Alvaro Herrera" <alvherre(at)dcc(dot)uchile(dot)cl>
Cc: "Lpostgres (E-mail)" <pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx>
Subject: RE: [Pgsql-ayuda] Full join de tres tablas
Date: 2004-02-13 08:52:05
Message-ID: 3E4C5135046BD74F8EBA6A3A99FC3E700BEA07@dos.sipec.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Gracias Alvaro,

finalmente conseguí lo que quería mientras esperaba a ver que respondía la gente de la lista, y es justo lo que tú dijiste. El problema es que a veces nos emperramos en un tipo de solución y se necesita algo de perspectiva para solucionar las cosas, o intentar buscar desde otro lado...

Bueno, os muestro la consulta tal y como queda al final, justo haciendo lo que propone Alvaro: Un union de los internos (campos clave) de las tres tablas y luego un left join con con cada una de ellas.

SELECT
totaltmp.id_iinterno,
CASE WHEN a.id_iinterno IS NOT NULL THEN 1
ELSE 0
END AS articulo,
CASE WHEN s.id_iinterno IS NOT NULL THEN 1
ELSE 0 END AS stock,
CASE WHEN i.id_iinterno IS NOT NULL THEN 1
ELSE 0
END AS info
from
(select articulos.id_iinterno from articulos
union
select stock.id_iinterno from stock
union
select info_etiqueta.id_iinterno from info_etiqueta) as totaltmp
left join articulos a on totaltmp.id_iinterno=a.id_iinterno
left join stock s on totaltmp.id_iinterno=s.id_iinterno
left join info_etiqueta i on totaltmp.id_iinterno=i.id_iinterno;

Esto me da cuatro columnas: La primera tiene todos los internos, y las otras tres tienen un 1 en caso de que exista el interno en su tabla. Así:

INTERNO ARTICULOS STOCK INFO_ETIQUETA
__________________________________________________

10 1 0 0
11 0 1 1

Etc...

Gracias por todo.
saludos,

Rafa

Rafael Vigata
Programador Retail Software
rvigata(at)sipec(dot)es <mailto:rvigata(at)sipec(dot)es>

Tel. 934 800 560
Fax 934 800 505

Sipec
Soluciones informáticas para el comercio

-----Mensaje original-----
De: Alvaro Herrera [mailto:alvherre(at)dcc(dot)uchile(dot)cl]
Enviado el: jueves, 12 de febrero de 2004 21:21
Para: Rafael Vigata
CC: Lpostgres (E-mail)
Asunto: Re: [Pgsql-ayuda] Full join de tres tablas

No existen los full joins de tres tablas. De hecho, todos los joins son
de dos tablas. Ahora, lo que si existe es hacer un join con otro join.

Creo que lo que necesitas es hacer un full join y luego un left join con
la tercera tabla. No, de hecho eso no funcionara si tienes IDs que solo
esten en la tercera tabla ... bueno, no estoy en condiciones de hacer
experimentos en este momento, pero creo que deberias jugar con los otros
tipos de outer join. Quizas necesites hacer UNION de los IDs en las
tres tablas, y luego hacer JOIN con ellas mismas.

O quizas necesites arreglar el modelo ...

--
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
Officer Krupke, what are we to do?
Gee, officer Krupke, Krup you! (West Side Story, "Gee, Officer Krupke")

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Armando Maldonado 2004-02-13 12:32:32 Re: [Pgsql-ayuda] OID de un registro. Virus en "pgsql-ayuda.mbox"
Previous Message Alexander Quilca Condori 2004-02-13 04:56:45 [Pgsql-ayuda] InfoServer