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
Ответы
Ответ 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