2012-01-05 77 views
0

我想获得两个结果集的差异,这些结果集的生成和加入相对昂贵。我提到这一点是因为我可以想象解决方案(例如使用UNION),需要多次加入集合。我需要它在以下格式:Name sysname, OldValue varchar(max), NewValue varchar(max)Diff,未赋值

我们假设两个结果集看起来都像FirstName varchar(32), LastName varchar(32), Age int, BirthDate datetime,加上一些不会影响差异结果集的连接列。

我首先想到的是一样的东西

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 2012-01-06 15:14:20