2012-01-05 12 views
0

2つの結果セットの差分を生成し、生成して結合するのが比較的高価です。私はこれを言及します。なぜなら、複数のセットに参加する必要があるソリューション(例えば、UNIONを使用して)を想像できるからです。私は以下のフォーマットでそれを必要とします:Name sysname, OldValue varchar(max), NewValue varchar(max)差分、アンピボット

たとえば、両方の結果セットがFirstName varchar(32), LastName varchar(32), Age int, BirthDate datetimeのように見えて、diff結果セットに寄与しない結合カラムがいくつかあるとします。

私が最初に考えたのは、それらに参加、その後、2つのアンピボットの結果セット、古い値に1つ、新しいのための1つを作成

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 */ 

のようなものです。ひどいですね。これを行う簡単な方法はありますか?

答えて

0

さて、あなたはELSEを中止しました。いずれか(あるいはそれより悪い)がNULLの場合、比較も偽になります。

これらの問題とは別に、おそらくあなたが得るほど効率的です。

差異のセットが通常小さい場合(しかし、それを取得する作業が大きい場合)、差異のみを一時テーブルに挿入して、そこから視覚的には魅力的ではないテクニックで作業することができます複数のスキャンが必要)。

+0

私は 'ELSE'を省略していますが、nullは単純さをチェックしますが、それでも良い点はあります。あまりにも簡単なことはありません。 SQL 2008では、 'MERGE' +' OUTPUT'節で実行できるようです。それは正しいようですか?たぶんこれはアップグレードするのに良い時期です。 – Daniel