Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Duplicados base de datos SQL

Estas en el tema de Duplicados base de datos SQL en el foro de Bases de Datos General en Foros del Web. Buenas tardes tengo el siguiente problema, a ver si podéis ayudarme. Necesito eliminar artículos duplicados de una base de datos. El problema es que tengo ...
  #1 (permalink)  
Antiguo 18/11/2019, 09:16
 
Fecha de Ingreso: febrero-2012
Mensajes: 18
Antigüedad: 7 años, 9 meses
Puntos: 0
Duplicados base de datos SQL

Buenas tardes tengo el siguiente problema, a ver si podéis ayudarme.
Necesito eliminar artículos duplicados de una base de datos. El problema es que tengo varias descripciones para el mismo articulo. Utilizo SQL Server

Ejemplo:

CodigoArticulo Descripción
xxxxx Descripcion 1
xxxxx Descripcion 2
xxxxx Descripcion 3


Mi idea es sacar el código de articulo solo una vez, con una de las 3 descripciones, me daría igual cual.

Gracias de antemano.
  #2 (permalink)  
Antiguo 20/11/2019, 13:13
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.410
Antigüedad: 13 años, 3 meses
Puntos: 774
Respuesta: Duplicados base de datos SQL

Podrias hacer algo asi:


Código SQL:
Ver original
  1. SELECT * FROM tabla AS t1
  2. INNER JOIN(
  3. SELECT DISTINCT codigo FROM tabla) AS t2 ON (t1.codigo=t2.codigo)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 20/11/2019, 15:40
 
Fecha de Ingreso: abril-2011
Mensajes: 52
Antigüedad: 8 años, 8 meses
Puntos: 13
Respuesta: Duplicados base de datos SQL

Haz un GROUP BY a CodigoArticulo para juntar todos los registros que tienen el mismo código en uno solo:

Código SQL:
Ver original
  1. SELECT * FROM tabla GROUP BY CodigoArticulo;

Si hay varias descripciones se seleccionará la primera por defecto.

Nota: esto no funciona en Oracle porque Oracle te obliga a usar funciones de agregación, pero en SQL server debería funcionar.

Última edición por prueba230683; 20/11/2019 a las 15:54
  #4 (permalink)  
Antiguo 21/11/2019, 10:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.410
Antigüedad: 13 años, 3 meses
Puntos: 774
Respuesta: Duplicados base de datos SQL

Cita:
Iniciado por prueba230683 Ver Mensaje
Haz un GROUP BY a CodigoArticulo para juntar todos los registros que tienen el mismo código en uno solo:

Código SQL:
Ver original
  1. SELECT * FROM tabla GROUP BY CodigoArticulo;

Si hay varias descripciones se seleccionará la primera por defecto.

Nota: esto no funciona en Oracle porque Oracle te obliga a usar funciones de agregación, pero en SQL server debería funcionar.
Tampoco funciona en sql, te marcaria error porque no todas las columnas estan agrupadas o necesitan una funcion de agregacion
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 21/11/2019, 15:39
 
Fecha de Ingreso: abril-2011
Mensajes: 52
Antigüedad: 8 años, 8 meses
Puntos: 13
Respuesta: Duplicados base de datos SQL

Cita:
Iniciado por Libras Ver Mensaje
Tampoco funciona en sql, te marcaria error porque no todas las columnas estan agrupadas o necesitan una funcion de agregacion
Vaya Gracias por confirmarlo.

Ya que estamos, una pregunta. En el código que pones:

Código SQL:
Ver original
  1. SELECT * FROM tabla AS t1
  2. INNER JOIN(
  3. SELECT DISTINCT codigo FROM tabla) AS t2 ON (t1.codigo=t2.codigo)

Si un INNER JOIN es realmente un producto cartesiano (todos los registros de una tabla se combinan con todos los de la otra siguiendo el criterio marcado por la cláusula ON) realmente no estarías eliminando los duplicados no?

Última edición por prueba230683; 21/11/2019 a las 15:49
  #6 (permalink)  
Antiguo 22/11/2019, 00:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.410
Antigüedad: 13 años, 3 meses
Puntos: 774
Respuesta: Duplicados base de datos SQL

Si tienes razon, tendriamos que usar otro campo la distinguirlo, en el ejemplo que se menciona podria ser el campo descripcion, o en su defecto usar un rownumber con partition :P algo como esto:


Código SQL:
Ver original
  1. SELECT * FROM tabla AS t1
  2. INNER JOIN(
  3. SELECT ROW_NUMBER() OVER(partition BY codigo ORDER BY codigo) AS rn, codigo FROM tabla) AS t2 ON (t1.codigo=t2.codigo AND t1.rn=1)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me



La zona horaria es GMT -6. Ahora son las 21:47.