[Pgsql-ayuda] Join con campos null

Antonio Castro acastro@ciberdroide.com
Mon, 31 Dec 2001 09:57:38 +0100 (CET)


On 20 Dec 2001, Lic. Jaime N. Charles Trevi=F1o wrote:

> El jue, 20-12-2001 a las 13:50, Oscar Cano R. escribi=F3:
> > >Saludos ...
> > >Tengo un problema con un query, el cual realiza un
> > >join de dos tablas, como las sig:
> > >La Tabla A consta de dos campos
> > >cve_a  not null
> > >Nombre not null
> > >la llave de esta tabla es el campo cve_a
> > >
> > >La Tabla B consta de dos campos
> > >cve_b not null
> > >cve_a
> > >Descripcion not null
> > >la llave de esta tabla es el campo cve_b
> > >
> > >quiero hacer un select de la siguiente froma:
> > >SELECT nombre,Descripcion
> > >FROM   A,B
> > >WHERE  A.cve_a =3D B.cve_a;
> > >
> > >Donde el campo B.cve_a (de la tabla B), puede contener
> > >valores NUll. Cuando ejecuto el select me trae solo
> > >los
> > >registros que cumplen la condicion: A.cve_a =3D B.cve_a,
> > >pero no me trae los registros de la tabla B que tienen
> > >el campo cve_a =3D NULL
> > >
> > >En oracle se que se puede hacer de la siguiente forma:
> > >SELECT nombre,Descripcion
> > >FROM   A,B
> > >WHERE  A.cve_a =3D B.cve_a (+);

Supongo que lo que quieres hacer es lo siguiente:

SELECT nombre,Descripcion
FROM   A,B
WHERE  ( A.cve_a =3D B.cve_a ) OR ( B.cve_a IS NULL )

Seguramente los parentesis no son necesarios.

De todas formas tu query es un join extra=F1o. Si tu tabla A tiene=20
digamos (m) registros y tu tabla B tiene (n) registros.
Obtendr=E1s (m) tuplas por cada B.cve_a igual a NULL .

No se me ocurre que inter=E9s puede tener una cosa as=ED en la pr=E1ctica.
Ignoro que representan las entidades A y B y que tipo de relaci=F3n=20
quieres establecer entre ellas. Si describes todo ello con palabras
quiz=E1s pueda ayudarte mejor.

> > Lo que yo hice fue poner un campo que por default B.cve_a tome un=20
> > valor que te substitulla el null p.ej
> > tabla A
> > cve_a | Nombre
> > 0         |  (NULL)
> > 1         | Juan
> > 2         | Oscar
> > 3         | Maria
> > 4         | Rocio
> >=20
> > tabla B(cve_a default 0)
> > cve_b | cve_a | Descripcion
> > 1         |  1         | cuate
> > 2         |  0         | Interesado
> > 3         |  0         | Barbero
> > 4         |  2         | Hermano
> > 5         | 0          | Ley
> >=20
> > Asi es como yo solucione este rollo, espero te sirva.
> > Salu2.

Bueno ya expliqu=E9 que un cero y un nulo no tienen nada que ver
y usar valores ficticios en lugar de NULL no suele ser buena=20
idea.


Un saludo

Antonio Castro

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--=
+
        /\     /\      Ciberdroide Inform=E1tica (Tienda de Linux)
          \\W//            <<< http://www.ciberdroide.com >>>
=09 _|0 0|_                                                   =20
+-oOOO--(___o___)--OOOo----------------------------------------------------=
+=20
|  . . . . U U . . . . Antonio Castro Snurmacher  acastro@ciberdroide.com  =
| =20
|  . . . . . . . . . .                                                     =
|=20
+()()()----------()()()----------------------------------------------------=
+
| *** 1.700 sitios clasificados por temas sobre Linux en ***Donde_Linux*** =
|
| <<< http://www.ciberdroide.com/misc/donde/dondelinux.html >>>            =
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--=
+