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

[SOLUCIONADO] Validar registros duplicados de una columna, tomando varias posiciones de la cadena

Estas en el tema de Validar registros duplicados de una columna, tomando varias posiciones de la cadena en el foro de SQL Server en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original DECLARE @MATCHCODE  VARCHAR ( 50 )         -- Declaración del cursor DECLARE cMATCHCODE CURSOR FOR   ...
  #1 (permalink)  
Antiguo 05/12/2013, 17:30
 
Fecha de Ingreso: diciembre-2013
Mensajes: 8
Antigüedad: 10 años, 4 meses
Puntos: 0
Pregunta Validar registros duplicados de una columna, tomando varias posiciones de la cadena

Código SQL:
Ver original
  1. DECLARE @MATCHCODE  VARCHAR(50)
  2.        
  3. -- Declaración del cursor
  4. DECLARE cMATCHCODE CURSOR FOR
  5.     SELECT DISTINCT SUBSTRING(MATCHCODE,1,13) FROM PROCESO_TAB
  6.         WHERE SUBSTRING(MATCHCODE,1,13) IN
  7.         (SELECT SUBSTRING(MATCHCODE,1,13) FROM PROCESO_TAB AS DUPLICADO_13
  8.         GROUP BY SUBSTRING(MATCHCODE,1,13) HAVING COUNT(1) > 1 )
  9.         ORDER BY SUBSTRING(MATCHCODE,1,13)
  10.     FOR UPDATE
  11.  
  12. -- Apertura del cursor
  13. OPEN cMATCHCODE
  14.  
  15. -- Lectura de la primera fila del cursor
  16.     FETCH cMATCHCODE INTO @MATCHCODE
  17.  
  18.     WHILE (@@FETCH_STATUS = 0 )
  19.  
  20.     BEGIN
  21.         UPDATE PROCESO_TAB
  22.         SET M13 = 'S'
  23.         WHERE SUBSTRING(MATCHCODE,1,13) = @MATCHCODE
  24.  
  25.         -- Lectura de la siguiente fila del cursor
  26.         FETCH cMATCHCODE INTO @MATCHCODE
  27.     END
  28.  
  29.     BEGIN
  30.         UPDATE PROCESO_TAB
  31.         SET M13 = 'N'
  32.         WHERE SUBSTRING(MATCHCODE,1,13) <> @MATCHCODE
  33.  
  34.         -- Lectura de la siguiente fila del cursor
  35.         FETCH cMATCHCODE INTO @MATCHCODE
  36.     END
  37.  
  38. -- Cierre del cursor
  39. CLOSE cMATCHCODE
  40. -- Liberar los recursos
  41. DEALLOCATE cMATCHCODE

Última edición por gnzsoloyo; 05/12/2013 a las 17:59
  #2 (permalink)  
Antiguo 05/12/2013, 18:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

¿Y se supone que tienes alguna pregunta?
¿O estás exponiendo el código solamente por diversión?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 05/12/2013, 18:15
 
Fecha de Ingreso: diciembre-2013
Mensajes: 8
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

Que tal, si tengo una pregunta, disculpen si no se a copiado .. Error de dedo:
Es la siguiente:

Requiero de su ayuda para validar registros duplicados e insertar en la misma tabla donde se encuentran dichos registros la letra "s" si han encontrado registros duplicados y una "n" en caso contrario. Al principio tengo que validar toda la cadenas, posteriormente 13 posiciones, después 11, y por ultimo 10 posicione.

Ya lo he logrado con un cursor, pero al substraer 13 posiciones no logro que funcione correctamente, apenas estoy aprendiendo esta tecnología es por eso que estoy atorado con este detalle, espero puedan auxiliarme, añado código:
Código SQL:
Ver original
  1. DECLARE @MATCHCODE  VARCHAR(50)
  2.        
  3. -- Declaración del cursor
  4. DECLARE cMATCHCODE CURSOR FOR
  5.     SELECT DISTINCT SUBSTRING(MATCHCODE,1,13) FROM PROCESO_TAB
  6.         WHERE SUBSTRING(MATCHCODE,1,13) IN
  7.         (SELECT SUBSTRING(MATCHCODE,1,13) FROM PROCESO_TAB AS DUPLICADO_13
  8.         GROUP BY SUBSTRING(MATCHCODE,1,13) HAVING COUNT(1) > 1 )
  9.         ORDER BY SUBSTRING(MATCHCODE,1,13)
  10.     FOR UPDATE
  11.  
  12. -- Apertura del cursor
  13. OPEN cMATCHCODE
  14.  
  15. -- Lectura de la primera fila del cursor
  16.     FETCH cMATCHCODE INTO @MATCHCODE
  17.  
  18.     WHILE (@@FETCH_STATUS = 0 )
  19.  
  20.     BEGIN
  21.         UPDATE PROCESO_TAB
  22.         SET M13 = 'S'
  23.         WHERE SUBSTRING(MATCHCODE,1,13) = @MATCHCODE
  24.  
  25.         -- Lectura de la siguiente fila del cursor
  26.         FETCH cMATCHCODE INTO @MATCHCODE
  27.     END
  28.  
  29.     BEGIN
  30.         UPDATE PROCESO_TAB
  31.         SET M13 = 'N'
  32.         WHERE SUBSTRING(MATCHCODE,1,13) <> @MATCHCODE
  33.  
  34.         -- Lectura de la siguiente fila del cursor
  35.         FETCH cMATCHCODE INTO @MATCHCODE
  36.     END
  37.  
  38. -- Cierre del cursor
  39. CLOSE cMATCHCODE
  40. -- Liberar los recursos
  41. DEALLOCATE cMATCHCODE

Última edición por gnzsoloyo; 05/12/2013 a las 19:20 Razón: HE OLVIDADO AÑADIR EL CODIGO
  #4 (permalink)  
Antiguo 05/12/2013, 20:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

primero no uses cursores, segundo para validar lo que necesitas no hace falta que recorras toda tu tabla fila por fila podrias hacerlo con un simple query...si pones un ejemplo de tus datos y de como estas validando tu columna seria mas facil ayudarte :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 05/12/2013, 23:35
 
Fecha de Ingreso: diciembre-2013
Mensajes: 8
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

Tengo la siguiente tabla:

MATCHCODE M15 M13 M11 M9
MARE30678965HP4 NULL NULL NULL NULL
MARE30678965HP5 NULL NULL NULL NULL
MARE30678965HP6 NULL NULL NULL NULL
MARE30678965HP4 NULL NULL NULL NULL
MARE30671965MP8 NULL NULL NULL NULL
MARE30671965MP9 NULL NULL NULL NULL
ABCE30678965HP4 NULL NULL NULL NULL
  #6 (permalink)  
Antiguo 05/12/2013, 23:36
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

y como validas los datos tomando en cuenta que?? los ultimos 13 digitos despues los siguientes 11 hasta llegar a???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 05/12/2013, 23:45
 
Fecha de Ingreso: diciembre-2013
Mensajes: 8
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

MUCHAS GRACIAS POR RESPONDER, DISCULPA POR NO SER TAN CLARO, AQUI ESTA LA EXPLICACION

Tengo la siguiente tabla:

MATCHCODE M15 M13 M11 M9
MARE30678965HP4 NULL NUL NULL NULL
MARE30678965HP5 NULL NULL NULL NULL
MARE30678965HP6 NULL NULL NULL NULL
MARE30678965HP4 NULL NULL NULL NULL
MARE30671965MP8 NULL NULL NULL NULL
MARE30671965MP9 NULL NULL NULL NULL
ABCE30678965HP4 NULL NULL NULL NULL

Primerameramente necesito validar toda la cadena contenido en la columna "MATCHCODE", si existen registros duplicados en la columna "M15" insertar el valor "SI" de lo contrario "NO", posterirmente tengo que validar los primeros 13 caracteres de esa misma cadena, si existen registros duplicados en la columna "M13" insertar el valor "SI" de lo contrario "NO", de igual forma tengo que hacer lo mismo pero ahora validando los primeros 11 carecteres y despues los primeros 9 caracteres de la cadena contenida en la columna "MATCHCODE", e insertar sus correspondientes valores en "M11" y" M9". Eso es todo lo que tengo que hacer. .

Como ya pudiste notar en mi codigo anterior no se ejecuta bien la instrucción y estoy atorado con ese detalle, como habia mencionado antes apenas estoy aprendiendo y requiero de su apoyo para solucionar este problema.
  #8 (permalink)  
Antiguo 06/12/2013, 00:19
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

espero que el siguiente codigo te sirva:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. code VARCHAR(100)
  4. )
  5.  
  6.  
  7. INSERT INTO #temp VALUES ('MARE30678965HP4')
  8. INSERT INTO #temp VALUES ('MARE30678965HP5')
  9. INSERT INTO #temp VALUES ('MARE30678965HP6')
  10. INSERT INTO #temp VALUES ('MARE30678965HP7')
  11. INSERT INTO #temp VALUES ('MARE30678965HP4')
  12. INSERT INTO #temp VALUES ('MARE30678965H')
  13. INSERT INTO #temp VALUES ('MARE3067896')
  14. INSERT INTO #temp VALUES ('MARE306789')
  15. INSERT INTO #temp VALUES ('MARE30678')
  16. INSERT INTO #temp VALUES ('MARE30678')
  17.  
  18. SELECT primero, CASE WHEN m15>1 THEN 'si' ELSE 'no' END AS m15,
  19. CASE WHEN m13>1 THEN 'si' ELSE 'no' END AS m13,
  20. CASE WHEN m11>1 THEN 'si' ELSE 'no' END AS m11,
  21. CASE WHEN m9>1 THEN 'si' ELSE 'no' END AS m9
  22. FROM(
  23. SELECT primero,SUM(m15) AS m15,SUM(m13) AS m13,SUM(m11) AS m11,SUM(m9) AS m9 FROM
  24. (
  25. SELECT primero,
  26. CASE WHEN m15='si' THEN 1 ELSE 0 END AS m15,
  27. CASE WHEN m13='si' THEN 1 ELSE 0 END AS m13,
  28. CASE WHEN m11='si' THEN 1 ELSE 0 END AS m11,
  29. CASE WHEN m9='si' THEN 1 ELSE 0 END AS m9
  30. FROM(
  31. SELECT  t1.code AS primero,t2.code AS segundo,
  32. CASE WHEN (t1.code=t2.code AND len(t1.code)=len(t2.code)) AND (len(t1.code))=15 THEN 'Si' ELSE 'No' END AS m15,
  33. CASE WHEN (t1.code=t2.code AND len(t1.code)=len(t2.code)) AND (len(t1.code))=13 THEN 'Si' ELSE 'No' END AS m13,
  34. CASE WHEN (t1.code=t2.code AND len(t1.code)=len(t2.code)) AND (len(t1.code))=11 THEN 'Si' ELSE 'No' END AS m11,
  35. CASE WHEN (t1.code=t2.code AND len(t1.code)=len(t2.code)) AND (len(t1.code))=9 THEN 'Si' ELSE 'No' END AS m9
  36.  FROM #temp AS t1
  37. , #temp AS t2
  38.  ) AS t3
  39.  ) AS total GROUP BY primero
  40.  ) AS resultado

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 06/12/2013, 10:48
 
Fecha de Ingreso: diciembre-2013
Mensajes: 8
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

Que tal Libras espero te encuentres muy bien, te agradezco el tomarte el tiempo para realizar el codigo, pues si me ayudo un poco, muchas gracias, pero el detalle es que no puedo usar tablas temporales para este proceso, y yo estoy haciendo pruebas con la tabla que anteriormente puse, la cuestion es que tal ves haya mas de 500 registros e ir poniendo esos 500 registros nuevamente en una tabla interna seria doble trabajo pienso yo (Como comente anteriormente no tengo ninguna experiencia trabajando en SQL apenas estoy comenzando).

Los datos de la columna MATCHOCODE se me entregan en una cadena de 15 posiciones, y de esa codena tengo que hacer la validacion de registros duplicados, validando primero las 15 posiciones, luego a 13 posiciones. despues a 11 posiciones y por ultimo a 9 posiciones, de los datos que envie en la tabla si se sustraen a 11 y 9 posiciones pues todos serian tregistros repetidos .

TE agradezco muchisimo el haber contestado, tratare de adecuar tu codigo a lo que necesito .. , muchas gracias
  #10 (permalink)  
Antiguo 06/12/2013, 10:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

A ver vamos por partes como diria Jack el destripador jejeje, primero yo no cuento con tus datos ni con la tabla que tu usas por lo que uso y lleno una tabla temporal, si sustituyes la tabla temporal por tu tabla y por el campo que necesitas puede ser que te encuentres con una sorpresa ;)...

Ahora si quieres que la respuesta que te de sea exactamente la que implementes, entonces necesito acceso a tu base de datos o tu base de datos, la tabla que necesitas y todo lo demas, claro que eso conlleva un agradecimiento mayor al simple gracias($$$$$)........
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 06/12/2013, 11:05
 
Fecha de Ingreso: diciembre-2013
Mensajes: 8
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

Te agradezco, ya estoy trabajando en las adecuaciones, es solo un proyecto de Escuela no es tanto como para pagar , jejeje. cuando termine postere el codigo tal ves alguién le sirva y lo saque del apuro.

saludos cordiales
  #12 (permalink)  
Antiguo 06/12/2013, 11:41
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

Libras, ya tienes una CALIFICACCION ESCOLAR mas !!!
__________________
MCTS Isaias Islas
  #13 (permalink)  
Antiguo 06/12/2013, 11:42
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

Cita:
Iniciado por iislas Ver Mensaje
Libras, ya tienes una CALIFICACCION ESCOLAR mas !!!
Otra a mi cuenta, como la vez que en la uni tuve en una materia de calificacion final 2 dieces, 3 nueves, 2 ochos, y 3 sietes jejejejeje :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #14 (permalink)  
Antiguo 18/12/2013, 12:17
 
Fecha de Ingreso: diciembre-2013
Mensajes: 8
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

QUE TAL , YA HE RESUELTO EL PROBLEMA, (disculpen la tardanza no había tenido tiempo de postearlo), DEJO EL CÓDIGO PUEDE DE SER DE AYUDA PARA ALGUIEN

SALUDOS . . .
Código SQL:
Ver original
  1. DECLARE @MTCH VARCHAR(15)
  2. DECLARE @MTCH15 VARCHAR(15)
  3.  
  4. DECLARE MATCHCODE cursor FOR
  5.     SELECT DISTINCT MATCHCODE FROM PROCESO_TAB
  6.         WHERE MATCHCODE IN
  7.         (SELECT MATCHCODE FROM PROCESO_TAB AS DUPLICADO_15
  8.         GROUP BY MATCHCODE HAVING COUNT(1) > 1 )
  9.         ORDER BY MATCHCODE
  10.         FOR UPDATE
  11. OPEN  MATCHCODE
  12.     fetch MATCHCODE INTO @MTCH
  13.     while (@@fetch_status = 0 )
  14.     BEGIN
  15.         DECLARE MATCHCODE15 cursor FOR
  16.             SELECT DISTINCT(@MTCH)
  17.             FOR UPDATE
  18.         OPEN MATCHCODE15
  19.         UPDATE PROCESO_TAB
  20.             SET M15 = 'Y'
  21.             WHERE MATCHCODE = @MTCH
  22.         --print @MTCH
  23.         fetch MATCHCODE15 INTO @MTCH15
  24.        
  25.         BEGIN
  26.             --print @MTCH15
  27.             UPDATE PROCESO_TAB
  28.             SET M15 = 'N'
  29.             WHERE M15 IS NULL
  30.             OR M15 <> 'Y'
  31.         END
  32.     close MATCHCODE15
  33.     deallocate  MATCHCODE15
  34.     fetch MATCHCODE INTO @MTCH
  35. END
  36. close MATCHCODE
  37. deallocate MATCHCODE

Última edición por gnzsoloyo; 18/12/2013 a las 12:20 Razón: Se agradece usar HIGHLIGHT "SQL", por favor.
  #15 (permalink)  
Antiguo 18/12/2013, 12:40
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

bonito el codigo pero usas cursores, mi codigo no te sirvio supongo yo obtengo el mismo resultado pero sin cursores......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 18/12/2013, 19:20
 
Fecha de Ingreso: diciembre-2013
Mensajes: 8
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

Lo se, pero la especificacón fue utilizar un cursor,

he optimizado la misma función con una simple query, si requieren validar varias posiciones de la misma cadena como lo expuse en mi problema solo hagan un substring al campo y todo lo demás queda igual, disfrutenla:



Update proceso_tab
set m15 = 'n'

update proceso_tab
set m15 = 'y'
where matchcode in(
select matchcode as num
from proceso_tab
group by matchcode
having count(matchcode) > 1
)
  #17 (permalink)  
Antiguo 18/12/2013, 19:47
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Validar registros duplicados de una columna, tomando varias posiciones de

Pues dile a tu "teacher", que los cursores son como virus para SQL Server, afectan el tiempo de respuesta y creando cursores sin control, se puede llegar a tirar el servidor
__________________
MCTS Isaias Islas

Etiquetas: cadena, columna, duplicados, posiciones, registros, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:13.