[Php-avanzado] Consulta de conjuntos aplicada a SQL

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Vie Nov 27 02:04:40 ARST 2009


Hola Germán,

	Muy bueno lo de llevarlo a un caso concreto para entender mejor el
problema.

	la verdad es que no se me ocurre sin usar UNION.
	En tu mail original, me daba la impresión de que tenías la tabla de
"Clientes" por un lado, la tabla de "Localidades" por otro. y además una
tabla que establecía la relación. En ese caso, sí se me ocurría como
pensarlo usando esta tabla de pivote.
	Así con dos tablas, no importa la relación que establezcas, como un
campo NULL en cualquier registro hace NULL todo el registro, nunca as a
poner obtener 6 registros de resultado de una tabla que tiene 3 o 5!

	Si encontrás cómo resolverlo, avisanos!!!

El jue, 26-11-2009 a las 12:23 -0200, German Fernandez escribió:
> 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
> 
> 
> ______________________________________________________________________
> ¿Te llegan demasiados emails? Organizate con Hotmail. ¡Creá carpetas
> para todos tus correos!
> _______________________________________________
> 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



Más información sobre la lista de distribución Php-avanzado