Jump to content

Script SQL Server


Recommended Posts

Estimados, que tal?

tengo un inconveniente entre mis bases y necesito limpiar una de las tablas.. tengo que copiar todo lo que esta en una tabla y dejarla (obviamente) en otra pero sin que se repitan los registros. Lo malo es que la llave primaria es distinta porq al momento de insertar los registros venian con codigos distintos, por ende paso esa validacion. Como puedo hacer la consulta o las o el script para completar esto..

 

Estoy corriendo en MS SQL Server 2008...

 

Agradecido desde ya...

 

Link to comment
Share on other sites

A mi ya me pasó esto... lo que hice fue hacer 2 tablas. 1 principal y otra de detalle. En la principal colocas la PK padre y los campos correspondientes. En la detalle las 2 llaves (campos) que hacen que se te repitan un dato x cada registro.

Luego de crear las tablas haz un ciclo o un cursor para la la primera tabla (padre) incluyendo SÓLO EL PRIMER CAMPO CLAVE O PK y delante de ese campo colocale la palabra clave "DISTINCT". NO AGREGUES EL SEGUNDO campo clave. Si quieres puedes añadir demás campos, pero anda probando la consulta. Cuando ya tengas la consulta lista. Dentro del cursor realiza un insert into masivo a la tabla padre que creaste con la consulta del DISTINCT.

Para la segunda tabla realiza una consulta con los dos campos claves y realiza un insert into masivo y eso es todo. Pagina de ayuda http://www.devjoker.com/gru/Tutorial-Transact-SQL/TSQL/Tutorial-Transact-SQL.aspx

Link to comment
Share on other sites

Debes darte la paja de realizar la consulta para cada campo,

WHERE TABLA1.CAMPO_1 != TABLA2.CAMPO_1 AND AND AND... etc

 

Debería ser algo como esto

INSERT INTO Table2(campo1, campo2, campo3)

SELECT t1.campo1, t1.campo2, t1.campo3 etc... FROM Table1 as t1 Table2 as t2 WHERE t1.campo1 != t2.campo1 AND t1.campo2 != t2.campo2 etc...

 

Así debería ser más o menos, por lógica :tonto:

Link to comment
Share on other sites

Estimados, primero que nada agradecido x sus respuestas...

 

Entiendo y comprendo las posiciones de ambos, otra tabla mas no es una opcion, tengo que limpiar para eliminar la otra..

el distinct esta en el campo que se me repite, pero cuando quiero buscar el resto de la info de ese campo que vino unico, se me empiezan a repetir..

 

Tengo dos tablas temporales, en una tengo toda la info, repetidos y todo y en la otra tengo esos registros unicos, estoy comparando los registros para traer la data limpia y es aqui donde tengo que hacer 'el super script' para que me deje toda la data limpia.. pero aun asi se me repiten..

 

Tendre que aplicar otra tabla mas... o de que otra manera puedo traer esta data limpia... comparar los registros, inner join, not in, not exists... no se, estoy aplicando de todo...

 

 

GRACIAS!!

 

 

Link to comment
Share on other sites

Para eliminar los duplicados puedes hacer lo siguiente:

 

DECLARE @Table Table (A INT,
B INT,
C INT)
DECLARE @Table2 Table (B INT,
C INT)
insert into @Table values(1,1,1)
insert into @Table values(2,1,1)
insert into @Table values(3,1,1)
insert into @Table values(4,3,3)
insert into @Table values(5,3,3)
insert into @Table values(6,5,1)
insert into @Table values(7,123,33)
insert into @Table values(8,58,91)
insert into @Table values(9,36,73)
insert into @Table values(10,53,1)
WHILE EXISTS (SELECT b,c, count(a)
FROM @Table
GROUP BY b,c
HAVING COUNT(a) > 1)
BEGIN
INSERT INTO @Table2
SELECT b,c
FROM @Table
GROUP BY b,c
HAVING COUNT(a) > 1
SET ROWCOUNT 1
DELETE @Table FROM @Table t1
INNER JOIN @Table2 t2
ON t1.B = t2.B
AND t1.C = t2.C
SET ROWCOUNT 0
DELETE @Table2
END
SELECT * FROM @Table
Reemplaza @Table por tu tabla física (respalda antes por si falla), y declara en @Table2 los mismos campos sin la llave que puede ser distinta.
Si te fijas, la columna A, es siempre distinta, pero la columna B y C, pueden estar duplicadas (registros 1 al 4). en éste caso la columna A es la llave.
Saludos.
PD: La magia está en el set rowcount 1, set rowcount 0, que lo que hace es solo eliminar una coincidencia a la vez.
Edited by Siu
Link to comment
Share on other sites

Estimado Siu.. agradecido por vuestra rspta..

pero me perdi despues de los insert into... que hace ese script?

 

 

 

 

En definitiva,

 

Los primeros insert, son para prueba, es para llenar @Table con la muestra simulando tu tabla principal.

 

Luego básicamente hace un while mientras existan valores duplicados.

 

Luego inserta esos valores duplicados en otra tabla para luego poder comparar con tu tabla base y eliminar los registros según esos valores, donde comparas cada columna con tu tabla principal.

 

Luego elimina uno a uno cada valor de la tabla de paso de tu tabla principal

 

Y por último un select que muestra el resultado.

 

 

Saludos.

Edited by Siu
Link to comment
Share on other sites

Siu.. Me parece super bueno tu script, pero con una consulta...

al eliminar los duplicados elimino 'TODOS' los datos duplicados?? o dejo al menos uno...?

 

xq si tengo 3 numeros duplicados, debe kedar al menos uno en la tabla.. o los elimina los 3..?

segun entiendo bien los elimina los 3 y debiera kedar al menos uno...

 

un DELETE TOP(1) FROM table....... podria funcionar, pero no puedo validarlo con un INNER JOIN...

 

como lo harias?

 

Link to comment
Share on other sites

El script ya deja 1 de los datos, por eso el set rowcount 1, set rowcount 0, para que al eliminar solo lo haga 1 a la vez, por ende, después no estará dentro de los duplicados al pasar por el while.

 

ejemplos

 

si tienes los registros

 

1,1,1

2,1,1

3,1,1

 

lo que hace el script es eliminar el 1,1,1 el 2,1,1 pero deja el 3,1,1

 

 

 

ejecuta el mismo script copy/paste en una ventana de comando sql y ves el resultado.

Edited by Siu
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...