Ver Mensaje Individual
  #6 (permalink)  
Antiguo 04/07/2012, 08:12
ros0809
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Se agota el tiempo de semáforo al hacer un select

Hola,
Pongo un ejemplo con pocos datos para ver si se ve entiende mejor.

Aquí creo una tabla temporal con 2 elementos duplicados
Código:
DECLARE @Tbl_datos TABLE (A_codi int, TA_codi int, M_codi int)
INSERT INTO @Tbl_datos VALUES (22360,83,88)
INSERT INTO @Tbl_datos VALUES (26526,89,28)
INSERT INTO @Tbl_datos VALUES (26526,89,32)
INSERT INTO @Tbl_datos VALUES (26526,89,33)
INSERT INTO @Tbl_datos VALUES (26526,89,35)
INSERT INTO @Tbl_datos VALUES (26526,89,38)
INSERT INTO @Tbl_datos VALUES (26526,89,47)
INSERT INTO @Tbl_datos VALUES (26526,89,69)
INSERT INTO @Tbl_datos VALUES (26526,89,72)
INSERT INTO @Tbl_datos VALUES (26526,89,107)
INSERT INTO @Tbl_datos VALUES (26526,89,145)
INSERT INTO @Tbl_datos VALUES (26526,89,153)
INSERT INTO @Tbl_datos VALUES (26526,89,165)
INSERT INTO @Tbl_datos VALUES (26526,89,211)
INSERT INTO @Tbl_datos VALUES (26526,89,28)
INSERT INTO @Tbl_datos VALUES (26526,89,32)
Con ésto, consigo tener un campo que me dirá el número de apariciones dentro de la tabla
Código:
SELECT  *, ROW_NUMBER() OVER (PARTITION BY  A_codi, TA_codi, M_codi ORDER BY A_codi) AS counter
FROM    @Tbl_datos
Y con ésto, consigo eliminar los repetidos, de tal manera que sólo me quedo con los que son distintos, esto es, counter =1. (Con una tabla temporal no me funciona, pero si que funciona creándolo en una tabla normal)
Código:
WITH q AS
(
    SELECT  *, ROW_NUMBER() OVER (PARTITION BY  A_codi, TA_codi, M_codi ORDER BY A_codi) AS counter
    FROM    @Tbl_datos
)
DELETE
FROM    q
WHERE   counter > 1
El problema que tengo, es que el código anterior, para poder eliminar los repetidos, me recorre toda la tabla, y en la tabla que tengo, llamada EXCLUSION_MODALIDAD que contiene 142599 registros, me corta la sesión (se agota el tiempo de semáforo).

¿Se os ocurre alguna forma más óptima de poder eliminar los duplicados sin recorrer toda la tabla?
A mí se me ocurre algo así de éste estilo... pero no va bien..

Código:
DELETE e
FROM EXCLUSION_MODALIDAD e
INNER JOIN(
	SELECT e.A_codi,e.TA_codi,e.M_codi
	FROM EXCLUSION_MODALIDAD e 
	GROUP By e.A_codi,e.TA_codi,e.M_codi 
	Having Count(*) > 1
)q
ON q.A_codi = e.A_codi and q.TA_codi=e.TA_codi and e.M_codi=q.TA_codi
where q.A_codi = e.A_codi and q.TA_codi=e.TA_codi and e.M_codi=q.TA_codi
¿Alguna sugerencia??
Gracias de antemano.
Saludos