2010-07-17 13 views
11

Estoy buscando trabajos de investigación o escritos en la aplicación del algoritmo Longest Common Subsquence a tablas de SQL para obtener una vista de diferencia de datos. También se agradecen otras sugerencias sobre cómo resolver un problema de diferencia de tabla. El ser que las tablas de SQL tienen esta mala costumbre de que consigue bastante grande y la aplicación de algoritmos sencillos diseñados para el procesamiento de texto puede resultar en un programa que nunca termina desafío ...Diferencia de datos basada en SQL: subsecuencia común más larga

tan dieron una mesa Original:

Key Content 
1 This row is unchanged 
2 This row is outdated 
3 This row is wrong 
4 This row is fine as it is 

y la mesa New:

Key Content 
1 This row was added 
2 This row is unchanged 
3 This row is right 
4 This row is fine as it is 
5 This row contains important additions 

necesito averiguar la Diff:

+++ 1 This row was added 
--- 2 This row is outdated 
--- 3 This row is wrong 
+++ 3 This row is right 
+++ 5 This row contains important additions 
+1

Para que quede claro, el 'Key' impone un orden en las filas, de lo contrario términos como 'secuencia' y 'subsecuencia' no tendría ningún sentido en un conjunto desordenado (como una tabla relacional). –

+1

No olvide que las tablas, en teoría, no tienen ningún orden para las filas, lo que también complica las cosas. Debe definir un orden para las comparaciones de tablas. –

+2

No creo que esto sea diferente del problema habitual: lo mejor que puede hacer es O (n^2) (ignorando el tiempo para comparar las filas de la tabla) donde n es el número de filas. Si sabe que ninguna fila se mueve en más de k posiciones, puede hacerlo en O (nk) modificando el algoritmo de programación dinámica habitual. Probablemente tendrás que asumir algo como esto, con algunas k razonablemente pequeñas, si n^2 es demasiado grande. – ShreevatsaR

Respuesta

1

Si exporta sus tabls en archivos CSV, puede utilizar http://sourceforge.net/projects/csvdiff/

Cita: csvdiff es un script en Perl para diferencias/comparar dos archivos CSV con el posibilidad de seleccionar el separador. Las diferencias se mostrarán como: "Columna XYZ en el registro 999" es diferente. Después de esto, se mostrarán el resultado esperado real y para esta columna.

0

Esto es probablemente demasiado simple para lo que buscas, y no es investigación :-), sino simplemente conceptual. Me imagino que está buscando comparar diferentes métodos para procesar los gastos generales (?).

--Esta es la mitad de lo que no quiere (A)

SELECT o.Key FROM tbl_ORIGINAL o INNER JOIN tbl_NEW n WHERE o.Content = n.Content 

--Esta es la otra mitad de lo que no quiere (B)

SELECT n.Key FROM tbl_ORIGINAL o INNER JOIN tbl_NEW n WHERE o.Content = n.Content 

--Esta es la mitad de lo que quieren (C)

SELECT '+++' as diff, n.key, Content FROM tbl_New n WHERE n.KEY NOT IN(B) 

--Esta es la otra mitad de lo que usted desea (D)

SELECT '---' as diff, o.key, Content FROM tbl_Original o WHERE o.Key NOT IN (A) 

--Combining C & D

(C) 
Union 
(D) 
Order By diff, key 

Mejoras ...

  • intente crear vistas indizadas de las tablas de base primeros
  • intente reducir la longitud del contenido campo a su valor mínimo para unicidad (prueba/error), y luego usa eso resultado más corto para hacer sus comparaciones

- por ejemplo,para obtener la longitud min (1000 es arbitraria - sólo tiene una salida)

declare @i int 
set @i = 1 
While i < 1000 and Exists (
Select Count(key), Left(content,@i) From Table Having Count(key) > 1) 
BEGIN 
    i = @i + 1 
END 
Cuestiones relacionadas