Buscar Registros Duplicados con SQL y Como Eliminarlos

MANUAL~1

Esta sentencia SQL es muy importante ya si queremos migrar una BD  la podemos utilizar para saber que registros de nuestra BD estan duplicado o repetidos.

SELECT * FROM
    (
        SELECT campo1, campo2, campo3, campo4, COUNT( * ) AS TotalIguales
        FROM Table
        GROUP BY campo1, campo2, campo3, campo4
    ) AS Result
WHERE TotalIguales>1

Donde:

Campo1,Campo2…:  son los atributos de la tabla que queremos saber si hay o no datos repetidos.

AS TatalIguales:  Le asignamos este nombre a la columna donde sañdrán la cantidad de veces que se duplica un registro

GROUP BY campo1,campo2…: agrupamos por dichos campos

WHERE TotalIguales>1: Mostrar todos los campos que estan mas de 1 vez.

Eliminar Duplicados
Creamos el Siguiente Procedimiento:

DECLARE @campo1 int, @campo2 int,@campo3 int, @repeticiones int;
DECLARE @sqlexec varchar(200)
DECLARE dup_cursor
CURSOR FOR
SELECT campo1, campo2, campo3, repeticiones
FROM tabtemp
OPEN dup_cursor;
FETCH NEXT FROM dup_cursor INTO @campo1, @campo2, @campo3, @repeticiones;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlexec = ‘ set rowcount ‘ + CAST( (@repeticiones – 1) AS VARCHAR(3)) +
‘ delete from relSright where campo1 = ‘ + CAST(  @campo1 AS VARCHAR(10)) +
‘ and campo2 = ‘ + CAST(  @campo2  AS VARCHAR(10)) +
‘ and campo3 = ‘ +  CAST(@campo3 AS VARCHAR(10))
EXEC(@sqlexec)
FETCH NEXT FROM dup_cursor INTO @campo1, @campo2, @campo3, @repeticiones;
END
CLOSE dup_cursor;
DEALLOCATE dup_cursor;

@campo1,campo2… tienen que declararlo con el mismo tipo de variable a la que desean eliminar

Anuncios

SENTENCIA SQL – Operaciones Básicas

El lenguaje mas habitual para construir las consultas a Bases de Datos relacionales es SQl. Structure Query Language o Lenguaje Estructurado de Consultas. Un estandar implementado por los principales motores o sistemas de gestione de Bases de Datos relacionales.

El SQl permite:

  • Definir una base de datos mediante tablas
  • Almacenar información en tablas
  • Seleccionar la información que sea necesaria de la Base de Datos
  • Realizar cambios en la información y estructura de los datos
  • Combinar y calcular datos para conseguir la información necesaria

La sentecia SELECT
La sentecia SELECT es la principal manera que tiene el ususario de consultar información de la Base de Datos.


SELECT * FROM cliente —- Consulta que solicita a la Base de Datos seleccionar todos los campos de la tabla cliente.

la claúsula WHERE es la forma de especificar una condicion dentro de una sentencia select es mediante la claúsula WHERE, que especifica una condición lógica que devolverá únicamente aquellos registros que cumplan.
SELECT *
FROM cliente
WHERE sexo = ‘MASCULINO’

La sentecia INSERT
La sentencia INSERT permite la introducción de nuevos registros dentro de un esquema. Su sintaxis, que ya se ha visto, especifica el nombre de una tabla. los atributos que se van a insertar, y lo valores para dichos atributos. Si insertamos un valor nulo para un atributo que no acepta ese tipo de valores, o si no especificamos un valor concreto para este tipo de columnas, se va producir un error y la fila no seta insertada.
Sintaxis:

INSERT INTO cliente
(idclient, nombres, direccion, ruc)
VALUES (‘001′,’CARLOS ALBERTO’,’AV LOS ANDES S/N’,’20200736139′)

La Sentecia UPDATE

Esta sentecia es la que permite la actualización de la información almacenada en la Base de Datos. Si la sentecia INSERT se utiliza para añadir nueva información, la sentecia UPDATE se utiliza para modificar la información existente. Su sintaxis es la siguiente:

UPDATE FROM cliente
SET idcliente=’001′, nombres=’CARLOS’,

direccion=’REAL 123′, ruc=’12345678123′

WHERE idcliente=’001′

La Sentecia DELETE
La sentecia DELETE es la que nos permite borrar los registros almacenados en la Base de datosm ya sea en una tabla especifica. Su sintaxis es la siguiente:

DELETE FROM <tabla>
WHERE <condicion>

DELETE FROM cliente
WHERE idcliente=’001′

Donde se eliminara el registro de la tabla especifica llamada cliente en el registro perteneciente de codigo "001"

Ese no tan desconocido: Object Data Source para Aplicaciones de Escritorio

No hace mucho encontre un artículo acerca del control Object Data Source, solo que estaba enfocado para aplicaciones Web, esta vez les presento el “mismo” control pero para escritorio. Vayan sabiendo que aunque el control se llama igual, dista mucho de su primo que vive en la versión Web. La principal diferencia radica en que esta versión de ODS, no puede ejecutar métodos, solo recibe una fuente de datos. Eso si, cuando ODS trabaja enlazado con grillas, nos damos cuenta de su poder y de cómo nos facilita el desarrollo de aplicaciones.

Empezando
Deberán remitirse a este tutorial para crear la base de datos de prueba y junto con ella la tabla de personas, además aquí usaremos esta tabla también:

img001.jpg

La cual es llamada Temporal, y posee un campo llamado idrelacion, que será el que nos permita crear un maestro/detalle, me tome la molestia de llenar la tabla temporal con algunos datos:img002.jpg

Idrelacion especifica que deberá existir una fila en la tabla Personas que posea ese ID.
Construyendo la aplicación en .NET
Crearemos una aplicación que luce así:
img003.jpg

Es por ello que deberán agregar al formulario dos grillas (no por ahora, ya veremos mas adelante como) y un botón (el código fuente de esta nota se encuentra adjunto así que no teman); esas grillas están relacionadas a un ODS, y el movimiento entre filas para refrescar una grilla o la otra lo hace automáticamente el ODS.
Empezaremos por crear la clase Persona, que contendrá los campos que figuran en la tabla del tutorial anterior pero que además contara con un miembro del tipo lista, llamado Childs.
Pongo aquí una porción de código para que lo tengan como referencia:

public class EntityPersona
{
private int _id;
private string _nombre;
private string _apellido;
private string _telefono;
private List _childs = new List(); …

}

Esa es la clase entidad que representa a la tabla personas, como ya se habrán dado cuenta me gusta trabajar en capas, mas adelante quizás haga un tutorial sobre el trabajo en capas y como nos puede facilitar la vida…aunque su mal uso nos puede traer muchas complicaciones.
La lista que allí figura es del tipo “Temporal” que es una clase muy similar a la que acabamos de ver, es así:
public class Temporal
{
private int _id;
private string _nombre;
private string _apellido;


}
Pasaremos a crear las clases mapeadoras (aquellas que se encargan de acceder a la base de datos), para este articulo no habrá otro tipo de acceso a la base de datos sino para obtenerlos de la misma, es decir, no hay nada de inserciones ni modificaciones; aunque para aquellos que estén leyendo esto seria una buena practica; de hecho pueden tomar como referencia el tutorial anterior de ODS.

public class MapperPersona
{
public DataTable Select()
{
string cmdText = “select * from personas”;
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter sqlDa = new SqlDataAdapter();
SqlConnection cnn = new SqlConnection(“User ID=sa;Initial Catalog=BaseDePrueba;Data Source=.”);
cnn.Open();
cmd.Connection = cnn;
cmd.CommandText = cmdText;
cmd.CommandType = CommandType.Text;sqlDa.SelectCommand = cmd;
sqlDa.Fill(dt);
cnn.Close();return dt;

}
}
public class MapperTemporal
{
public DataTable Select(int id)
{
string cmdText = “select * from temporal where idrelacion = ” + id.ToString();
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter sqlDa = new SqlDataAdapter();
SqlConnection cnn = new SqlConnection(“User ID=sa;Initial Catalog=BaseDePrueba;Data Source=.”);

cnn.Open();
cmd.Connection = cnn;
cmd.CommandText = cmdText;
cmd.CommandType = CommandType.Text;

sqlDa.SelectCommand = cmd;
sqlDa.Fill(dt);
cnn.Close();

return dt;

}
}

Ambos mapeadores son listados en todo su esplendor, el mapeador de Persona trae todas las filas de la tabla, mientras que el mapeador de la tabla Temporal en su método Select recibe un ID, pues bien, dado que en este caso la tabla temporal actúa como “hija” de la tabla personas, la forma de acceder a las hijas dado un padre es a través del id del padre, que es justamente lo que recibe.
Por ultimo crearemos la clase de servicio, que hará de osquertador entre los mapeadores (recuerden que esta clase tranquilamente puede tener lógica de negocio incluida):

public List FetchAll()
{
try
{
List entities = new List();
MapperPersona mapper = new MapperPersona();
MapperTemporal mapperT = new MapperTemporal();
EntityPersona entity;
DataTable dt = mapper.Select();foreach (DataRow dr in dt.Rows)
{
entity = new EntityPersona((int)dr[“id”], (string)dr[“nombre”], (string)dr[“apellido”], (string)dr[“telefono”]);
dt = mapperT.Select(entity.Id);
foreach (DataRow dr1 in dt.Rows)
{
entity.Childs.Add(new Temporal((int)dr1[“id”], (string)dr1[“nombre”], (string)dr1[“apellido”]));
}
entities.Add(entity);
}
return entities;
}
catch
{
throw;
}
}

En este caso la clase cuenta con un método llamado FetchAll, que devuelve una lista de entidades del tipo “EntityPersona” junto a la lista de tipo “Temporal” de cada una.

Agregando el control ODS
A continuación procederemos a agregar una nueva fuente de datos, para ello nos dirigimos al menú Data y de allí a Add New Data Source:

img004.jpg

En la ventana que sigue seleccionaremos que la fuente será de un objeto, y luego seleccionamos el tipo de objeto del cual obtendremos los datos:

img005.jpg

Presionamos finalizar y eso es todo. Lo que sigue es pedirle al IDE que nos muestre las fuentes de datos disponibles, así que del menú Data seleccionamos Show Data Source, un panel se desplegara y debería ser como sigue:

img006.jpg

Desde ese panel solo habrá que arrastrar hacia el formulario desde EntityPersona y desde Childs, ambas al ser arrastradas aparecerán como grillas enlazadas.
Vayamos al código fuente de la pantalla, y peguemos esto en el evento Load del formulario:
ServicePersona srv = new ServicePersona();
this.entityPersonaBindingSource.DataSource = srv.FetchAll();
Esas simples líneas nos permitirán enlazar ambas grillas, notaran que cuando se muevan en la grilla padre, se refrescaran los datos en la grilla de las hijas, de manera automática; y como si esto fuera poco, el ODS nos brinda de manera totalmente transparente la adición de nuevas entidades, tanto padres como hijas:

img007.jpg

En el botón Save deberán tener el siguiente código en el evento clic para que vean que no les miento:
EntityPersona entity = (EntityPersona) this.entityPersonaBindingSource.Current;
Pongan un punto de corte allí y vean como la entidad seleccionada se ha modificado sin que ustedes tengan que poner una sola línea de código:

img008.jpg

Luego ustedes tranquilamente podrían mandar a actualizar la entidad, ya que esta habría sido cargada de manera automática.
Espero este artículo les haya sido útil Saludos CVVA.

Link a la descarga.

Fuente: Aquí

Ese no tan desconocido: Object Data Source para Aplicaciones de Escritorio

 QODS_Box
No hace mucho encontre un artículo acerca del control Object Data Source, solo que estaba enfocado para aplicaciones Web, esta vez les presento el “mismo” control pero para escritorio.
Vayan sabiendo que aunque el control se llama igual, dista mucho de su primo que vive en la versión Web.
La principal diferencia radica en que esta versión de ODS, no puede ejecutar métodos, solo recibe una fuente de datos.
Eso si, cuando ODS trabaja enlazado con grillas, nos damos cuenta de su poder y de cómo nos facilita el desarrollo de aplicaciones.
 
Bueno veamos acerca de este articulo AQUI