SiR_HuNTeR Posted February 18, 2014 Report Share Posted February 18, 2014 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 More sharing options...
zeo_ultimate Posted February 19, 2014 Report Share Posted February 19, 2014 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 More sharing options...
RALCN Posted February 19, 2014 Report Share Posted February 19, 2014 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 estoINSERT 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 More sharing options...
zeo_ultimate Posted February 19, 2014 Report Share Posted February 19, 2014 Si no entiendes muy bien mandame un mp o mensaje a mi cuenta de usuario de chilecomparte. Oka Link to comment Share on other sites More sharing options...
SiR_HuNTeR Posted February 19, 2014 Author Report Share Posted February 19, 2014 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 More sharing options...
Siu Posted February 19, 2014 Report Share Posted February 19, 2014 (edited) 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 @TableGROUP BY b,cHAVING 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 @Table2END 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 February 19, 2014 by Siu Link to comment Share on other sites More sharing options...
SiR_HuNTeR Posted February 19, 2014 Author Report Share Posted February 19, 2014 Estimado Siu.. agradecido por vuestra rspta..pero me perdi despues de los insert into... que hace ese script? Link to comment Share on other sites More sharing options...
Siu Posted February 19, 2014 Report Share Posted February 19, 2014 (edited) 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 February 19, 2014 by Siu Link to comment Share on other sites More sharing options...
SiR_HuNTeR Posted February 19, 2014 Author Report Share Posted February 19, 2014 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 More sharing options...
Siu Posted February 20, 2014 Report Share Posted February 20, 2014 (edited) 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,12,1,13,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 February 20, 2014 by Siu Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now