Hola a todos,
Tengo por un lado una tabla con unos registros y por otro lado una tabla con el mismo esquema de datos y otros registros. ¿Existe alguna forma de cruzar estas tablas para que me devuelva una tabla con los registros que tengan en comun pero que exista algun campo modificado en una de ellas? Si esto se puede hacer ¿Existe alguna forma de cruzarlas y que te devuelva una tabla con los registros que este en una de ellas pero no en la otra? muchas gracias de antemano.
Puedes poner algun ejemplillo?
Tabla A
ID,Nombre,Apellidos,Edad...
1,Javi,Estrella,27....
Tabla B
ID,Nombre,Apellidos,Edad...
1,Javi,Estrella,29...
2,Ana,Garcia,29...
Como resultado me tendria que dar esto
Tabla X para las altas es decir para registros que la tabla A no tiene
ID,Nombre,Apellidos,Edad...
2,Ana,Garcia,29...
Tabla X1 para las modificaciones
ID,Nombre,Apellidos,Edad...
1,Javi,Estrella,29...
A y B son DataTable
El problema radica que hay un proceso muy costoso que tengo que optimizar. Recibo un fichero de texto plano cada 30 minutos ~25000 registros y tengo que compararlos con los que hay en una tabla que contiene ~60000. De ahi mi pregunta.
Y he de suponer que los tienes en una base de datos? O en un fichero? Es que no se que es un DateTable. Me estas hablando de php? Mysql? C++?
Si los recibes en una tabla texto como csv, y tienes una base de datos, puedes insertar en mysql ese archivo eb yba tabla auxiliar. Despues con una query, saber la lista de elementos que estan en los dos, y esto no seria tan costoso.
Para finalizar, borras la tabla auxiliar y aire
Buenas.
Eso de DateTable me suena que estas usando .net, lo q no se si en Visual Basic, en c# o en q exactamente.
Mi consejo va con una pregunta que ya te han hecho, te llega por archivo de texto o estan ya en sql?? Si te llega en texto yo te aconsejaria que te crearas tu una funcion que las comparase...previamente le pones a tu tabla de 60.000 un indice para q sea mas rapida (si no lo tenia) y asi te sera mucho mas facil. Creo que habia una funcion en DateTable que te permitia buscar por el campo indice ^^
Si los datos los tienes en sql, entonces mejor haz q trabaje el servidor de base de datos.
SUERTE
Si la base de datos es mysql, creo que es capaz de comerse un csv en texto con una sola orden. Es mas lento por que lo tienes que copiar a una tabla pero si no programas muy bien, seguro que el resultado es mucho mas rapido.
Extrañamente parece que al final no llego la respuesta que puse, pero es ado .net el lenguaje que uso es c#. El fichero de texto es de un as400 que recibo. No es csv, hasta ahora como lo hacen es coger el campo id y lo van comparando contra la tabla que contiene 60000, con lo que es un proceso muy lento. Mi idea es intentar sacar un datatable de la tabla de 60000 y lo mismo con los 25000 registros del fichero. Intentar que se cruce las tablas para ver si existe alguna forma de que te devuelvan los registros que halla algun campo que este modificado y los registros que no esten. Pero si alguien que sabe mas que yo del tema se le ocurre alguna forma mas optima de hacer esto, pues a la escucha estoy.
Creo que no hay una forma directa de hacerlo.
Podrias crearte sobre un datatable una primary key (sobre el que tenga mas datos) y recorrerte todas las filas del otro y por cada registro (datarow) buscar su ID en el otro datatable con el metodo miDT2.Rows.Find (q utiliza la PK creada antes) te devolvera la fila q tenga ese ID o null si no existe el registro.
Es la forma que se me ocurre, pero no me parece que sea muy buena ni muy eficiente.
Creo que ahora mismo lo estan haciendo asi, pero lo leen del fichero de texto directamente. Se me acaba de ocurrir una idea existe algo para comparar entre ficheros de xml?
Con XPath puedes realizar queries sobre un fichero XML, pero no tengo ni idea de lo rápido o lento que es... Creo que la funcion es XmlNode.SelectNodes(string xpathQuery).
Un saludo!
Vicente
Gracias vicente, muy interesante.
Buenas.
Solo por curiosidad, las tablas estan ordenadas de alguna manera?? ya sea por id o por nombre propio.....lo comento pq en vez de hacer una busqueda secuencial quizas te pueda interesar hacer otro tipo de busqueda mas adecuada.....no se si es su nombre, pero la busqueda de la tijera iria bien con tantos registros.
En caso de que no esten ordenados...la tabla q ya tienes, es siempre la misma?? Si es la misma podrías crearte tu los indices en un vector y aplicar lo de antes.
De todos modos lo de Xml suena interesante, ya nos contaras ^^
Cita de: "shephiroth"no se si es su nombre, pero la busqueda de la tijera iria bien con tantos registros.
[OT]Creo que querías decir "búsqueda binaria" ;)[/OT]
No se su nombre real, yo siempre la llame de la tijera pq la vas "cortando" por la mitad, y teniendo tantos registros con un par de ifs te has pulido el 75% de la tabla, que no es poco.
Estoy mirando en la wikipedia, y si, es busqueda binaria xDD
Quiza te refieras al quick sort. Es bastante eficiente. Y si no recuerdo mal consistia en ir dividiendo todos los elementos en 2 mitades. Es un algoritmo del tipo divide y venceras.
Como dice Vicente el xpath esta muy bien para realizar busquedas en XML.
Puedes encontrar informacion sobre esto en http://www.w3schools.com/xpath/default.asp
Para hacer pruebas con XPATH te puedes bajar una pequeña aplicacion que tengo en mi blog (viene con codigo fuente) que te hace busquedas en xml y te resalta los resultado. Tambien te formatea el XML.
http://www.brausoft.com/descargas/
http://www.brausoft.com/2006/09/12/creando-un-visor-de-xml-parte-i/
http://www.brausoft.com/2006/09/13/creando-un-visor-de-xml-parte-ii/
El algoritmo que comentais es el arbol binario, donde puede existir más de una rama. Por norma general con dos ramas es suficiente, y la busqueda se hace a partir de la raiz vas recorriendo nodos. Pero eso es como lo hace la mayaria de gestores de base de datos. Las busquedas se hacen a partir de indices, por eso para optimizar las base de datos se colocan indices numericos, ya que es más facil compararlos etc... De momento mirare lo de xpath que me ha parecido una forma muy potente de realizar busquedas en ficheros de texto. Muy interesante tu blog bnl :wink:
[OT]bnl: un apunte solo, quicksort es para ordenar no para buscar.[/OT]
Un saludo!
Vicente
Tienes toda la razon vicente. Menudo lapsus. Lo vi en la univ y no he vuelto a tocarlo.