Подтвердить что ты не робот

SQL-данные diff: самая длинная общая подпоследовательность

Я ищу научные статьи или статьи при применении алгоритма 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
4b9b3361

Ответ 1

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

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

Ответ 2

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

- Это половина того, чего вы не хотите (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

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

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

- например. для получения минимальной длины (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