Различие данных на основе SQL: самая длинная общая подпоследовательность - PullRequest
12 голосов
/ 17 июля 2010

Я ищу исследовательские работы или статьи по применению алгоритма Longest Common Subsquence к таблицам SQL для получения представления различий данных.Другие предложения о том, как решить проблему с таблицами, также приветствуются.Проблема состоит в том, что таблицы SQL имеют эту неприятную привычку получать довольно БОЛЬШИЕ и применять простые алгоритмы, предназначенные для обработки текста, что может привести к тому, что программа никогда не закончится ...

, поэтому при наличии таблицы 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

и таблица 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

Мне нужно выяснить 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

Ответы [ 2 ]

1 голос
/ 23 июля 2010

Если вы экспортируете ваши таблицы в csv-файлы, вы можете использовать http://sourceforge.net/projects/csvdiff/

Цитата: csvdiff - это Perl-скрипт для сравнения / сравнения двух CSV-файлов с возможностью выбора разделителя.Различия будут отображаться так: «Колонка XYZ в записи 999» отличается.После этого будет показан фактический и ожидаемый результат для этого столбца.

0 голосов
/ 25 марта 2011

Это, вероятно, слишком просто для того, что вы ищете, и это не исследование :-), а просто концептуально. Я полагаю, вы хотите сравнить различные методы обработки накладных расходов (?).

- Это половина того, чего ты не хочешь (A)

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

- Это другая половина того, что вы не хотите (B)

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

- Это половина того, что вы действительно хотите (C)

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

- Это другая половина того, что вы действительно хотите (D)

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

- Объединение C & D

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

Улучшения ...

  • попробуйте создать индексированные представления базовые таблицы сначала
  • попробуйте уменьшить длину поле содержимого, чтобы это мин для уникальность (проба / ошибка), а затем использовать этот более короткий результат, чтобы сделать ваш сравнение

- например чтобы получить минимальную длину (1000 произвольно - просто нужен выход)

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
...