2012-01-05 3 views
0

Я хочу получить diff двух результирующих наборов, которые относительно дорого производить и объединяться. Я упоминаю об этом, потому что могу представить себе решения (например, используя UNION), которые требуют объединения множеств несколько раз. Мне это нужно в следующем формате: Name sysname, OldValue varchar(max), NewValue varchar(max).Diff, unpivoted

Предположим, что оба набора результатов выглядят как FirstName varchar(32), LastName varchar(32), Age int, BirthDate datetime, а также ряд соединительных столбцов, которые не будут вносить вклад в набор результатов diff.

Моя первая мысль что-то вроде

select 
    case when a.FirstName <> b.FirstName then a.FirstName as FirstName_Old, 
    case when a.FirstName <> b.FirstName then b.FirstName as FirstName_New, 
    /* and so on, for remaining columns */ 

затем создать два unpivoted результирующих наборов, один для старых значений, один для нового, а затем присоединиться к ним. Звучит ужасно. Есть ли более простой способ сделать это?

ответ

0

Ну, вы остановились на ELSE, и если (или, что еще хуже, оба) являются NULL, сравнение будет также ложным.

Помимо этих проблем, это, вероятно, так же эффективно, как и вы.

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

+0

Я пропустил 'ELSE' и нулевые проверки для простоты, но тем не менее хороший момент. Жаль, что нет более простого способа сделать это. В SQL 2008 кажется, что это можно сделать с помощью предложения 'MERGE' +' OUTPUT'. Правильно ли это? Возможно, сейчас самое подходящее время для обновления. – Daniel

Смежные вопросы