Eliminar duplicados ojala solo fuera eso!!

03/12/2007 - 15:17 por gandy | Informe spam
Hola, primero perdonar mi negación para la expresión escrita...

Colate es así; [tempo], [stampo], [nome_prodotto], [id_h],
[tempo_preparazione_s], [num_extra_time], [err_in_colata_prec], [barcode],
[tempo_ricetta], [num_macchina], [num_testa], [num_prog], [num_col_mac],
[num_col_tes], [port_iso_set], [port_pol1_set], [port_pol2_set],
[port_cat_set], [pres_iso_set], [pres_pol1_set], [pres_pol2_set],
[pres_cat_set], [temp_iso_set], [temp_pol1_set], [temp_pol2_set],
[temp_cat_set], [peso_col_set], [port_iso_real], [port_pol1_real],
[port_pol2_real], [port_cat_real], [pres_iso_real], [pres_pol1_real],
[pres_pol2_real], [pres_cat_real], [temp_iso_real], [temp_pol1_real],
[temp_pol2_real], [temp_cat_real], [peso_col_real], [port_iso_all],
[port_pol1_all], [port_pol2_all], [port_cat_all], [pres_iso_all],
[pres_pol1_all], [pres_pol2_all], [pres_cat_all], [temp_iso_all],
[temp_pol1_all], [temp_pol2_all], [temp_cat_all], [peso_col_all],
[col_senza_all], [peso_col_iso], [peso_col_pol1], [peso_col_pol2],
[peso_col_cat], [num_carosello], [cod_porta_stampo], [cod_stampo_a],
[cod_stampo_b], [idasa]

si hago
- Select distinct from colate
me dice que tengo 600 registros dferentes, ojo registros para SQL,
esto es que tienen todos sus campos distintos, no? pero yo sé que lo que
quiero es otra cosa, que los campos que realmente hacen distinto a un
registro son 5, los de la siguiente sentencia, que si estos son distintos el
registro es distinto, y si sql me dice que no es por que la tabla esta mal y
duplica valores, y atención a esto; haciendo distintos algunos campos, por
que le sale de dentro al que los mete, de tal forma que la select distinct me
dice que hay menos campos que los que realmetne hay.
Si hago
- select tempo,id_h,cod_porta_stampo, stampo, num_carosello, count (*)
RESPES
from colate
group by tempo,id_h,cod_porta_stampo, stampo, num_carosello
having count (*)>1
Me dice dice que 650, que se repiten entre 6, 2, 3 cada uno de ellos.
Quiero coger el resultado de esta select pero con todos los campos y
meterlos en una tabla temporal, para poder eliminar sin problemas de colate
los duplicados y luego volver a meter estos datos sin el campo "repes" en
colate, para así tener todos los campos pero sin duplicados.

Gracias,

Preguntas similare

Leer las respuestas

#6 Carlos M. Calvelo
05/12/2007 - 14:32 | Informe spam
Hola,

On 5 dec, 12:54, gandy wrote:
Hola y gracias antes de pedior nada más...
el caso es que hago esto...
use pruebas

declare @tempo datetime, @id_h smallint, @cod_porta_stampo smallint, @stampo
nchar, @num_carosello smallint, @repes int
declare c_colate cursor for
Select tempo, id_h, cod_porta_stampo, stampo, num_carosello, count (*) repes
from colate
group by tempo, id_h, cod_porta_stampo, stampo, num_carosello
having count(*)>1
OPEN c_colate -- Abro cursor
WHILE(1=1) -- entro en el ciclo
BEGIN
FETCH NEXT FROM c_colate INTO @tempo, @id_h, @cod_porta_stampo, @stampo,
@num_carosello

y me responde esto

Servidor: mensaje 16924, nivel 16, estado 1, línea 13
Cursorfetch: el número de variables declaradas en la lista INTO debe
coincidir con el de columnas seleccionadas.




El cursor define 6 columnas y el fetch solo lee 5 variables.
En el fetch te olvidas de la columna repes, el count(*).

Pero... qué problemas tienes con la solución que te he dado
anteayer para borrar los 'repes'?
Se te ha dado una solución para SS 2005 y otra para SS 2000.
Y has dicho que usas SQL Server 2000.

Saludos,
Carlos
Respuesta Responder a este mensaje
#7 gandy
05/12/2007 - 15:03 | Informe spam
Hola,
Mira que hago lo del cursor por que creia que era la mejor solución para
SS2K, si debo usar otra mejor indicamela por favor.
En todo caso: Hago lo que pongo más abajo, y la select * from
colate_reg_completos
no tiene nada, no deberia tener registros completos de los repetidos en
colate, pero solo una vez, para que despues de eliminarlos del colate poder
agregarlos?
use pruebas
/*
declare @tempo datetime, @id_h smallint, @cod_porta_stampo smallint, @stampo
nchar, @num_carosello smallint, @repes int
declare c_colate cursor for
Select tempo, id_h, cod_porta_stampo, stampo, num_carosello, count (*) repes
from colate
group by tempo, id_h, cod_porta_stampo, stampo, num_carosello
having count(*)>1
OPEN c_colate -- Abro cursor
WHILE(1=1) -- entro en el ciclo
BEGIN
FETCH NEXT FROM c_colate INTO @tempo, @id_h, @cod_porta_stampo, @stampo,
@num_carosello, @repes
IF (@@fetch_status < 0)
select top 1 [tempo], [stampo], [nome_prodotto], [id_h],
[tempo_preparazione_s], [num_extra_time], [err_in_colata_prec], [barcode],
[tempo_ricetta], [num_macchina], [num_testa], [num_prog], [num_col_mac],
[num_col_tes], [port_iso_set], [port_pol1_set], [port_pol2_set],
[port_cat_set], [pres_iso_set], [pres_pol1_set], [pres_pol2_set],
[pres_cat_set], [temp_iso_set], [temp_pol1_set], [temp_pol2_set],
[temp_cat_set], [peso_col_set], [port_iso_real], [port_pol1_real],
[port_pol2_real], [port_cat_real], [pres_iso_real], [pres_pol1_real],
[pres_pol2_real], [pres_cat_real], [temp_iso_real], [temp_pol1_real],
[temp_pol2_real], [temp_cat_real], [peso_col_real], [port_iso_all],
[port_pol1_all], [port_pol2_all], [port_cat_all], [pres_iso_all],
[pres_pol1_all], [pres_pol2_all], [pres_cat_all], [temp_iso_all],
[temp_pol1_all], [temp_pol2_all], [temp_cat_all], [peso_col_all],
[col_senza_all], [peso_col_iso], [peso_col_pol1], [peso_col_pol2],
[peso_col_cat], [num_carosello], [cod_porta_stampo], [cod_stampo_a],
[cod_stampo_b], [idasa]
INTO colate_reg_completos
FROM [pruebas].[dbo].[colate]
where @tempo=colate.tempo and @id_h=colate.id_h and
@cod_porta_stampo=colate.cod_porta_stampo and @stampo=colate.stampo and
@num_carosello=colate.num_carosello
BREAK -- Rompo el Ciclo
END
DEALLOCATE c_colate -- Quito mi cursor de la memoria
*/
select * from colate_reg_completos


"Carlos M. Calvelo" wrote:

Hola,

On 5 dec, 12:54, gandy wrote:
> Hola y gracias antes de pedior nada más...
> el caso es que hago esto...
> use pruebas
>
> declare @tempo datetime, @id_h smallint, @cod_porta_stampo smallint, @stampo
> nchar, @num_carosello smallint, @repes int
> declare c_colate cursor for
> Select tempo, id_h, cod_porta_stampo, stampo, num_carosello, count (*) repes
> from colate
> group by tempo, id_h, cod_porta_stampo, stampo, num_carosello
> having count(*)>1
> OPEN c_colate -- Abro cursor
> WHILE(1=1) -- entro en el ciclo
> BEGIN
> FETCH NEXT FROM c_colate INTO @tempo, @id_h, @cod_porta_stampo, @stampo,
> @num_carosello

> y me responde esto
>
> Servidor: mensaje 16924, nivel 16, estado 1, línea 13
> Cursorfetch: el número de variables declaradas en la lista INTO debe
> coincidir con el de columnas seleccionadas.
>

El cursor define 6 columnas y el fetch solo lee 5 variables.
En el fetch te olvidas de la columna repes, el count(*).

Pero... qué problemas tienes con la solución que te he dado
anteayer para borrar los 'repes'?
Se te ha dado una solución para SS 2005 y otra para SS 2000.
Y has dicho que usas SQL Server 2000.

Saludos,
Carlos

Respuesta Responder a este mensaje
#8 Carlos M. Calvelo
05/12/2007 - 15:30 | Informe spam
On 5 dec, 15:03, gandy wrote:
Hola,
Mira que hago lo del cursor por que creia que era la mejor solución para
SS2K, si debo usar otra mejor indicamela por favor.



En el otro hilo tienes la solución haciendo uso de
una columna identity. Pero no lo has leído?


En todo caso: Hago lo que pongo más abajo, y la select * from
colate_reg_completos
no tiene nada, no deberia tener registros completos de los repetidos en
colate, pero solo una vez, para que despues de eliminarlos del colate poder
agregarlos?



Entiendo que quieres pasar los registros a otra tabla.
Estas poniendo:
select top 1 .
...
...
INTO colate_reg_completos
...

Y tendría que ser:
insert into colote_reg_completos (col1,col2,col3, ...)
from select top 1
...

Pero yo miraría antes la solución del otro hilo.

Donde pone lo de:

delete colate
from ...

puedes hacer antes un:

select colate.*
from

para controlar que registros vas a borrar cuando ejecutes
el delete.

Saludos,
Carlos



use pruebas
/*
declare @tempo datetime, @id_h smallint, @cod_porta_stampo smallint, @stampo
nchar, @num_carosello smallint, @repes int
declare c_colate cursor for
Select tempo, id_h, cod_porta_stampo, stampo, num_carosello, count (*) repes
from colate
group by tempo, id_h, cod_porta_stampo, stampo, num_carosello
having count(*)>1
OPEN c_colate -- Abro cursor
WHILE(1=1) -- entro en el ciclo
BEGIN
FETCH NEXT FROM c_colate INTO @tempo, @id_h, @cod_porta_stampo, @stampo,
@num_carosello, @repes
IF (@@fetch_status < 0)
select top 1 [tempo], [stampo], [nome_prodotto], [id_h],
[tempo_preparazione_s], [num_extra_time], [err_in_colata_prec], [barcode],
[tempo_ricetta], [num_macchina], [num_testa], [num_prog], [num_col_mac],
[num_col_tes], [port_iso_set], [port_pol1_set], [port_pol2_set],
[port_cat_set], [pres_iso_set], [pres_pol1_set], [pres_pol2_set],
[pres_cat_set], [temp_iso_set], [temp_pol1_set], [temp_pol2_set],
[temp_cat_set], [peso_col_set], [port_iso_real], [port_pol1_real],
[port_pol2_real], [port_cat_real], [pres_iso_real], [pres_pol1_real],
[pres_pol2_real], [pres_cat_real], [temp_iso_real], [temp_pol1_real],
[temp_pol2_real], [temp_cat_real], [peso_col_real], [port_iso_all],
[port_pol1_all], [port_pol2_all], [port_cat_all], [pres_iso_all],
[pres_pol1_all], [pres_pol2_all], [pres_cat_all], [temp_iso_all],
[temp_pol1_all], [temp_pol2_all], [temp_cat_all], [peso_col_all],
[col_senza_all], [peso_col_iso], [peso_col_pol1], [peso_col_pol2],
[peso_col_cat], [num_carosello], [cod_porta_stampo], [cod_stampo_a],
[cod_stampo_b], [idasa]
INTO colate_reg_completos
FROM [pruebas].[dbo].[colate]
where @tempo=colate.tempo and @id_h=colate.id_h and
@cod_porta_stampo=colate.cod_porta_stampo and @stampo=colate.stampo and
@num_carosello=colate.num_carosello
BREAK -- Rompo el Ciclo
END
DEALLOCATE c_colate -- Quito mi cursor de la memoria
*/
select * from colate_reg_completos


Respuesta Responder a este mensaje
#9 gandy
05/12/2007 - 16:27 | Informe spam
Hola, cierto y gracias Carlos, no habia intentado el tema con identity... y
te cuento
si meto el idd en el select... having... me da como distintas todas las
filas, con lo que no me sirve, ahoa bien si lo quito me da los registros que
realmente puedo eliminar, pero que pasa que ya no tengo el idd en la tabal
colate2 y ya no puedo cojer el memor. Ya que el idd crea registros
secuenciamente, yo pense que si se repetia incrementaba en 1, de tal forma
que los distintos tendrian el campo idd 1 y los repetidos 2,3,4... segun las
veces que se repita.

Select tempo, id_h, cod_porta_stampo, stampo, num_carosello, count (*) AS
"repes"
into colate2
from colate
group by tempo, id_h, cod_porta_stampo, stampo, num_carosello
having count(*) >1
(12223 filas afectadas)

Si hago
Select idd, tempo, id_h, cod_porta_stampo, stampo, num_carosello, count (*)
AS "repes"
into colate2b
from colate
group by idd, tempo, id_h, cod_porta_stampo, stampo, num_carosello
having count(*) >1
me dice
(0 filas afectadas)
por que idd los hace a todos distintos
"Carlos M. Calvelo" wrote:

On 5 dec, 15:03, gandy wrote:
> Hola,
> Mira que hago lo del cursor por que creia que era la mejor solución para
> SS2K, si debo usar otra mejor indicamela por favor.

En el otro hilo tienes la solución haciendo uso de
una columna identity. Pero no lo has leído?


> En todo caso: Hago lo que pongo más abajo, y la select * from
> colate_reg_completos
> no tiene nada, no deberia tener registros completos de los repetidos en
> colate, pero solo una vez, para que despues de eliminarlos del colate poder
> agregarlos?

Entiendo que quieres pasar los registros a otra tabla.
Estas poniendo:
select top 1 .
...
...
INTO colate_reg_completos
...

Y tendría que ser:
insert into colote_reg_completos (col1,col2,col3, ...)
from select top 1
...

Pero yo miraría antes la solución del otro hilo.

Donde pone lo de:

delete colate
from ...

puedes hacer antes un:

select colate.*
from

para controlar que registros vas a borrar cuando ejecutes
el delete.

Saludos,
Carlos



> use pruebas
> /*
> declare @tempo datetime, @id_h smallint, @cod_porta_stampo smallint, @stampo
> nchar, @num_carosello smallint, @repes int
> declare c_colate cursor for
> Select tempo, id_h, cod_porta_stampo, stampo, num_carosello, count (*) repes
> from colate
> group by tempo, id_h, cod_porta_stampo, stampo, num_carosello
> having count(*)>1
> OPEN c_colate -- Abro cursor
> WHILE(1=1) -- entro en el ciclo
> BEGIN
> FETCH NEXT FROM c_colate INTO @tempo, @id_h, @cod_porta_stampo, @stampo,
> @num_carosello, @repes
> IF (@@fetch_status < 0)
> select top 1 [tempo], [stampo], [nome_prodotto], [id_h],
> [tempo_preparazione_s], [num_extra_time], [err_in_colata_prec], [barcode],
> [tempo_ricetta], [num_macchina], [num_testa], [num_prog], [num_col_mac],
> [num_col_tes], [port_iso_set], [port_pol1_set], [port_pol2_set],
> [port_cat_set], [pres_iso_set], [pres_pol1_set], [pres_pol2_set],
> [pres_cat_set], [temp_iso_set], [temp_pol1_set], [temp_pol2_set],
> [temp_cat_set], [peso_col_set], [port_iso_real], [port_pol1_real],
> [port_pol2_real], [port_cat_real], [pres_iso_real], [pres_pol1_real],
> [pres_pol2_real], [pres_cat_real], [temp_iso_real], [temp_pol1_real],
> [temp_pol2_real], [temp_cat_real], [peso_col_real], [port_iso_all],
> [port_pol1_all], [port_pol2_all], [port_cat_all], [pres_iso_all],
> [pres_pol1_all], [pres_pol2_all], [pres_cat_all], [temp_iso_all],
> [temp_pol1_all], [temp_pol2_all], [temp_cat_all], [peso_col_all],
> [col_senza_all], [peso_col_iso], [peso_col_pol1], [peso_col_pol2],
> [peso_col_cat], [num_carosello], [cod_porta_stampo], [cod_stampo_a],
> [cod_stampo_b], [idasa]
> INTO colate_reg_completos
> FROM [pruebas].[dbo].[colate]
> where @tempo=colate.tempo and @id_h=colate.id_h and
> @cod_porta_stampo=colate.cod_porta_stampo and @stampo=colate.stampo and
> @num_carosello=colate.num_carosello
> BREAK -- Rompo el Ciclo
> END
> DEALLOCATE c_colate -- Quito mi cursor de la memoria
> */
> select * from colate_reg_completos
>
>

Respuesta Responder a este mensaje
#10 Carlos M. Calvelo
05/12/2007 - 16:39 | Informe spam
Hola,

On 5 dec, 16:27, gandy wrote:
Hola, cierto y gracias Carlos, no habia intentado el tema con identity... y
te cuento
si meto el idd en el select... having... me da como distintas todas las
filas, con lo que no me sirve, ahoa bien si lo quito me da los registros que
realmente puedo eliminar, pero que pasa que ya no tengo el idd en la tabal
colate2 y ya no puedo cojer el memor. Ya que el idd crea registros
secuenciamente, yo pense que si se repetia incrementaba en 1, de tal forma
que los distintos tendrian el campo idd 1 y los repetidos 2,3,4... segun las
veces que se repita.

Select tempo, id_h, cod_porta_stampo, stampo, num_carosello, count (*) AS
"repes"
into colate2
from colate
group by tempo, id_h, cod_porta_stampo, stampo, num_carosello
having count(*) >1
(12223 filas afectadas)

Si hago
Select idd, tempo, id_h, cod_porta_stampo, stampo, num_carosello, count (*)
AS "repes"
into colate2b
from colate
group by idd, tempo, id_h, cod_porta_stampo, stampo, num_carosello
having count(*) >1
me dice
(0 filas afectadas)
por que idd los hace a todos distintos





No nos estamos entendiendo muy bien eh? :-)

Aquí lo pongo otra vez: (lee los comentarios
que te pongo con el código)

alter table colate
add idd int identity(1,1)


select colate.*
from colate inner join colate c2
on colate.tempo = c2.tempo and
colate.id_h = c2.id_h and
colate.cod_porta_stampo = c2.cod_porta_stampo and
colate.stampo = c2.stampo and
colate.num_carosello = c2.num_carosello and
colate.idd > c2.idd



delete colate
from colate inner join colate c2
on colate.tempo = c2.tempo and
colate.id_h = c2.id_h and
colate.cod_porta_stampo = c2.cod_porta_stampo and
colate.stampo = c2.stampo and
colate.num_carosello = c2.num_carosello and
colate.idd > c2.idd


alter table colate
drop column idd


Saludos,
Carlos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida