[Php-avanzado] Consulta de conjuntos aplicada a SQL

German Fernandez german_fdz85 en hotmail.com
Vie Nov 27 10:30:02 ARST 2009


Efectivamente, el FULL OUTER JOIN  es la clausula para realizar esta operación, y en SQL Server 2005 se puede utilizar.

Les dejo dos links exlicativos:

http://www.programacion.com/tutorial/sql/8/

http://es.wikipedia.org/wiki/JOIN

 

Desde ya gracias por su ayuda.

 

Fernadez Germán Analistad e sistemas
 
> Date: Fri, 27 Nov 2009 09:45:09 -0200
> From: matigea en gmail.com
> To: php-avanzado en pato2.fi.mdp.edu.ar
> Subject: Re: [Php-avanzado] Consulta de conjuntos aplicada a SQL
> 
> Probaste los OUTER JOIN? Fijate hacer un RIGHT OUTER JOIN o un FULL
> OUTER JOIN. Igualmente, si usás un motor MSSQL, me parece que no
> soporta OUTER JOINs, así que tu única solución sería el UNION.
> 
> Salu2!
> 
> El día 27 de noviembre de 2009 02:04, Leonardo Tadei - Pegasus Tech
> Supply <leonardot en pegasusnet.com.ar> escribió:
> > 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
> >
> > _______________________________________________
> > Php-avanzado mailing list
> > Php-avanzado en pato2.fi.mdp.edu.ar
> > http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
> >
> 
> 
> 
> -- 
> Matias Fernando Gea
> matigea en gmail.com
> http://www.mfgea.com.ar
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
 		 	   		  
_________________________________________________________________
¿Vos ya tenés SMS Messenger en tu celular? Registrate Aquí
http://www.somosmessengersiempre.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/20091127/6e006e5d/attachment-0001.htm 


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