[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