[Php-avanzado] Consulta de conjuntos aplicada a SQL
German Fernandez
german_fdz85 en hotmail.com
Jue Nov 26 12:23:08 ARST 2009
Remitirme al ejemplo original sería complicar más la cnsulta por que las tablas L y N en realidad son dos query y no tablas. Por esto cito un ejemplo más repesentativo:
tabla L (Clientes)
Codigo Nombre IDLocalidad
1 Pepe 1
2 Rubén 1
3 Juan 2
4 Estela Null
5 Olga 2
tabla N (Localidade)
Idlocaldad Descripcion
1 Mar del plata
2 Balcarce
3 Tandil
El resultado de la query debería ser:
Clientes.Nombre Localidades.Descripcion
pepe mar del plata
Ruben Mar del plata
Juan Balcarce
Estela Null
Olga Balcarce
Null Tandil
La consulta SQL sería:
SELECT Clientes.Nombre , Localidades.Descripcion FROM Clientes LEFT JOIN ON Clientes.IDLocalidad = Localidades.IDLocalidad
UNION
SELECT Clientes.Nombre , Localidades.Descripcion FROM Clientes RIGHT JOIN ON Clientes.IDLocalidad = Localidades.IDLocalidad
Con el primer select obtendría todos los registros en que no sea nulo el campo idlocalidad en la tabla clientes, y en la segunda consulta anexo la inversa, las que no sean nulas en localidades. Según el concepto de conjuntos, los registros que incluyen ambas consultas se incluyen una vez.
Ahora la cuestión es poder obtener este resultado sin hacer un union.
Por lsa dudas te adjunto la consulta original, pero advierto que es algo "pesada".
EL motor de base de dat es SQL Server 2005
> From: leonardot en pegasusnet.com.ar
> To: php-avanzado en pato2.fi.mdp.edu.ar
> Date: Wed, 25 Nov 2009 15:39:41 -0300
> Subject: Re: [Php-avanzado] Consulta de conjuntos aplicada a SQL
>
> Hola Germán,
>
> la solución al problema no es simple, y por tanto es posible que
> obtengas una query compleja.
>
> Si vas a usar UNION, más vale hacé UNION de todo y después filtrá, en
> lugar de filtrar, hacer union y después volver a filtrar.
>
> Por otra parte, yo lo pensaría haciendo relaciones con la tabla que
> tiene todos los elmentos. Me pierde un poco que tengas la tabla N, la L
> y después que digas que en la N tenés una referencia a la L... esto
> quiere decir que el primer listado de la tabla N no está completo, y que
> son 2 tablas pero que hablás como si fueran 3.
>
> Si enviás las estructuras y el vuelco de algunos datos, sería más fácil
> entender la situación.
>
> Saludos!
>
> El mié, 25-11-2009 a las 15:25 -0200, German Fernandez escribió:
> > Tengo un problema:
> >
> > Dadas dos tablas con los siguientes elementos:
> >
> > Tabla N
> > 1
> > 2
> > 3
> > 4
> > 5
> >
> > Tabla L
> > A
> > B
> > C
> > D
> > E
> >
> > Agregando que en la tabla N tengo referencias a la tabla L de la
> > siguiente manera:
> >
> > 1 - A
> > 2 - B
> > 3 - C
> > 4 - A
> >
> > Lo q yo necesito, es realizar una consulta SQL que traiga como
> > resultado los elementos de N con referencias a la tabla L, los
> > elementos de N sin referencias a la tabla L ( hasta ahí con un LEFT o
> > RIGTH JOIN no tendría problemas) y los valores de la tabla( e aquí el
> > problema) L que no este referenciado en la tabla N.
> > Es decir, según el ejemplo el resultado debería ser:
> >
> > 1 - A
> > 2 - B
> > 3 - C
> > 4 - A
> > NULL - E
> > 5 - NULL
> >
> > La solución que encontré es hacer un LEFT JOIN y luego anexar los
> > registros faltantes con un UNION y realizando la inversa, es decir con
> > un RIGHT excluyendo los valores repetidos. Pero debido a que en el
> > problema original las Tablas L y N son subconsultas, la consulta final
> > se hace engorrosa de leer y muy grande. Por esto realizo la consulta,
> > para saber si hay una operación de conjuntos que no sea con UNION.
> >
> > Desde ya muchas gracias German Fernadez
> >
> >
> >
> >
> > ______________________________________________________________________
> > ¡Revisá de un vistazo si tenés correos nuevos! Ingresá a tu Hotmail
> > desde tu Messenger. ¡Probalo ahora!
> > _______________________________________________
> > Php-avanzado mailing list
> > Php-avanzado en pato2.fi.mdp.edu.ar
> > http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
> --
>
> Leonardo Tadei
> leonardot en pegasusnet.com.ar
> http://blog.pegasusnet.com.ar
> Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
_________________________________________________________________
¿Querés cuidar el medio ambiente? Ingresá a MSN Verde y seguí nuestros tips verdes
http://verde.latam.msn.com/
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://www3.fi.mdp.edu.ar/cgi-bin/mailman/private/php-avanzado/attachments/20091126/18f62d74/attachment.htm
------------ próxima parte ------------
Se ha borrado un texto insertado con un juego de caracteres sin especificar...
Nombre: CONSULTA.txt
Url: http://www3.fi.mdp.edu.ar/cgi-bin/mailman/private/php-avanzado/attachments/20091126/18f62d74/attachment.txt
Más información sobre la lista de distribución Php-avanzado