[Php-avanzado] Consulta de conjuntos aplicada a SQL
Matias Gea
matigea en gmail.com
Vie Nov 27 09:46:31 ARST 2009
Perdón, FULL OUTER JOIN es el que debería funcionar para tu caso.
Salu2
El día 27 de noviembre de 2009 09:45, Matias Gea <matigea en gmail.com> escribió:
> 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
>
--
Matias Fernando Gea
matigea en gmail.com
http://www.mfgea.com.ar
Más información sobre la lista de distribución Php-avanzado