Consulta para tabla con problemas

24/06/2004 - 14:36 por guillevillanuevasla | Informe spam
En una tabla mal cargada tengo claves duplicadas.
Ejemplo
DOCUMENTO - NOMAPEL
999 - Guillermo Villanueva
999 - Guillermo E Villanueva
787 - Natalia Chagra
754 - Juan Perez
853 - Carlos Tevez
853 - Carlitos Tevez
853 - Tevez

Es posible hacer una consulta que me devuelva estos datos y en los casos que el DOCUMENTO esté repetido devuelva el primero? Supongo que distinct y group by no sirven por que afectan a los dos campos en conjunto. Lo que yo quiero obtener es:
DOCUMENTO - NOMAPEL
999 - Guillermo Villanueva
787 - Natalia Chagra
754 - Juan Perez
853 - Carlos Tevez

Desde ya muchas gracias

Guillermo

Preguntas similare

Leer las respuestas

#1 Jose Mariano Alvarez \(MUG\)
24/06/2004 - 15:19 | Informe spam
Qué quieres hacer, borrarlos?
No existe ninguna garantía que el SQL Server te devuelva los datos en algún
orden determinado por lo que no hay primero o segundo a menos que pongas
order by.
Con group by + having count(*) podrías fácilmente sacar los de clave
duplicada que dicho sea de paso no deberían haber ocurido si hubieras usado
una Primary Key p Unique. Luego con un cursor podrías recorrer el resultado
para sacar facilmente los duplicados.
Existen otras formas pero esa es la más simple de explicar. Si tienes
índices y los duplicados son pocos esto funciona bien.


Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"guillevillanuevasla" wrote
in message news:
En una tabla mal cargada tengo claves duplicadas.
Ejemplo
DOCUMENTO - NOMAPEL
999 - Guillermo Villanueva
999 - Guillermo E Villanueva
787 - Natalia Chagra
754 - Juan Perez
853 - Carlos Tevez
853 - Carlitos Tevez
853 - Tevez

Es posible hacer una consulta que me devuelva estos datos y en los casos


que el DOCUMENTO esté repetido devuelva el primero? Supongo que distinct y
group by no sirven por que afectan a los dos campos en conjunto. Lo que yo
quiero obtener es:
DOCUMENTO - NOMAPEL
999 - Guillermo Villanueva
787 - Natalia Chagra
754 - Juan Perez
853 - Carlos Tevez

Desde ya muchas gracias

Guillermo





Revisado por AVG

Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.709 / Virus Database: 465 - Release Date: 23/06/2004
Respuesta Responder a este mensaje
#2 Jose Mariano Alvarez \(MUG\)
24/06/2004 - 16:06 | Informe spam
Esto te da los duplicados

Select
duplicados.cantidad, -- para saber cuantos hay
T.*
from
(
Select documento , count(*) cantidad
from tabla
goup by codigo
having count(*) > 1
) duplicados
join tabla T
on duplicados.documento = T.documento


Si tus prestadores están duplicados opino que debes eliminar los duplicados
sino te va a multiplicar en todos los join con esa tabla.
Otras alternativas matarían a tu servidor. Podrías usar funciones de
agrgación como en el ejemplo que tienes arriba para crear tablas derivadas
pero eso habría que hacerlo en cada acceso a esta tabla lo cual es una
locura.


Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"guillevillanuevasla" wrote
in message news:
José, gracias por tu rta.
No soy "dueño" de estas tablas, no puedo eliminar nada , lo único que


puedo hacer son consultas.
Conozco las formas de evitar estos problemas , pero no fui yo quien diseño


ni las tablas ni las aplicaciones que trabajan sobre ella.
Conozco la forma de usar having conunt pero no me sirve por que me


eliminaría datos que no quiero eliminar, en el ejemplo que di no aparecería
ni 999 ni 853 ¿comprenden?
Les cuento: por un lado tengo una tabla de prestaciones y por otro lado la


tabla de prestadores, estas tienen en común el campo documento si llego a
hacer la relación entre las dos para mostrar en las prestaciones el nombre
del prestador, aparecerán en algunos casos prestaciones repetidas, lo cual
sería un grave error.
Hay alguna otra manera de solucionarlo sin eliminar nada?
De nuevo gracias
Guillermo

"Jose Mariano Alvarez (MUG)" wrote:

> Qué quieres hacer, borrarlos?
> No existe ninguna garantía que el SQL Server te devuelva los datos en


algún
> orden determinado por lo que no hay primero o segundo a menos que pongas
> order by.
> Con group by + having count(*) podrías fácilmente sacar los de clave
> duplicada que dicho sea de paso no deberían haber ocurido si hubieras


usado
> una Primary Key p Unique. Luego con un cursor podrías recorrer el


resultado
> para sacar facilmente los duplicados.
> Existen otras formas pero esa es la más simple de explicar. Si tienes
> índices y los duplicados son pocos esto funciona bien.
>
>
> Jose Mariano Alvarez
> Comunidad de base de datos
> Grupo de Usuarios Microsoft
> www.mug.org.ar
>






Revisado por AVG

Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.709 / Virus Database: 465 - Release Date: 23/06/2004
Respuesta Responder a este mensaje
#3 Javier Loria
24/06/2004 - 17:22 | Informe spam
Hola Guillermo:
Si no puedes "tocar nada" podrias hacer:
SELECT Documento, MAX(Nomapel)
FROM Tabla
Esto no te da el primero o el ultimo te da el Maximo en este caso 999 -
Guillermo Villanueva (porque V>E), y 853 - Tevez (porque T>E). Tambien
puedes hacer MIN.
En SQL no existe el concepto de orden en la Tabla, no hay primera ni
ultima fila, debes dar algun criterio de seleccion MAX y MIN son los mas
universales pero talvez podrias buscar algun otra columna que sea mejor
criterio en la Tabla.
Una de las desventajas de la desnormalizacion es no saber cual de los
datos es el correcto, cuando difieren. :(
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
guillevillanuevasla
escribio:
En una tabla mal cargada tengo claves duplicadas.
Ejemplo
DOCUMENTO - NOMAPEL
999 - Guillermo Villanueva
999 - Guillermo E Villanueva
787 - Natalia Chagra
754 - Juan Perez
853 - Carlos Tevez
853 - Carlitos Tevez
853 - Tevez

Es posible hacer una consulta que me devuelva estos datos y en los
casos que el DOCUMENTO esté repetido devuelva el primero? Supongo que
distinct y group by no sirven por que afectan a los dos campos en
conjunto. Lo que yo quiero obtener es: DOCUMENTO - NOMAPEL 999 -
Guillermo Villanueva 787 - Natalia Chagra 754 - Juan Perez
853 - Carlos Tevez

Desde ya muchas gracias

Guillermo
Respuesta Responder a este mensaje
#4 guillevillanuevasla
24/06/2004 - 17:37 | Informe spam
Muchas gracias Javier, es lo que necesitaba.
Entiendo lo de la desnormalización, pero bueno, no lo diseñé yo ni nadie que tenga los mínimos conocimientos de diseño de bases de datos relacionales.


"Javier Loria" wrote:

Hola Guillermo:
Si no puedes "tocar nada" podrias hacer:
> SELECT Documento, MAX(Nomapel)
FROM Tabla
> Esto no te da el primero o el ultimo te da el Maximo en este caso 999 -
Guillermo Villanueva (porque V>E), y 853 - Tevez (porque T>E). Tambien
puedes hacer MIN.
En SQL no existe el concepto de orden en la Tabla, no hay primera ni
ultima fila, debes dar algun criterio de seleccion MAX y MIN son los mas
universales pero talvez podrias buscar algun otra columna que sea mejor
criterio en la Tabla.
Una de las desventajas de la desnormalizacion es no saber cual de los
datos es el correcto, cuando difieren. :(
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
guillevillanuevasla
escribio:
> En una tabla mal cargada tengo claves duplicadas.
> Ejemplo
> DOCUMENTO - NOMAPEL
> 999 - Guillermo Villanueva
> 999 - Guillermo E Villanueva
> 787 - Natalia Chagra
> 754 - Juan Perez
> 853 - Carlos Tevez
> 853 - Carlitos Tevez
> 853 - Tevez
>
> Es posible hacer una consulta que me devuelva estos datos y en los
> casos que el DOCUMENTO esté repetido devuelva el primero? Supongo que
> distinct y group by no sirven por que afectan a los dos campos en
> conjunto. Lo que yo quiero obtener es: DOCUMENTO - NOMAPEL 999 -
> Guillermo Villanueva 787 - Natalia Chagra 754 - Juan Perez
> 853 - Carlos Tevez
>
> Desde ya muchas gracias
>
> Guillermo



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida