比较 2 个表并跟踪更改的列和其他设置为 null

我在比较 2 个表时遇到了情况。一个是当前数据,另一个是以前数据的快照。比较的结果存储在#temp 表(已更改的行)中。之后,我将#temp 表与最后一个快照数据进行比较以跟踪更改的列。我需要为此我做了一个选择语句:

我正在考虑添加和 ROW_NUMber() 窗口函数,这可能会解决这个问题。 有什么建议吗?

h12405asdf 回答:比较 2 个表并跟踪更改的列和其他设置为 null

如果我理解正确,您可以使用 row_number()outer apply。后者将 FROM 子句更改为:

FROM #tempUpdatedAddress l OUTER APPLY
     (SELECT TOP (1) n.*
      FROM UpdatedEntityStg n 
      WHERE n.[ADDRESSID] = n.[ADDRESSID] 
      ORDER BY n.snapshotdate DESC
     ) n

注意:您没有指定如何知道快照的顺序,因此我为 snapshotdate 发明了 ORDER BY。使用包含订购信息的任何列。

,

聚合中似乎存在 NULL 比较。 SQL Server 的内置聚合函数会忽略 NULL。为了测试任何 NULL 值,查询检查 sum(case when [ADDRESS1] is null then 1 else 0 end)=0 等。类似这样的事情

with nullif_cte as (
    select l.[ADDRESSID],nullif(l.[ADDRESS1],n.[ADDRESS1]) ADDRESS1,nullif(l.[ADDRESS2],n.[ADDRESS2]) ADDRESS2,nullif(l.[ADDRESS3],n.[ADDRESS3]) ADDRESS3,nullif(l.[ADDRESS4],n.[ADDRESS4]) ADDRESS4,nullif(l.[CITY],n.[CITY]) [CITY],nullif(l.[CLIENTID],n.[CLIENTID]) [CLIENTID],nullif(l.[COUNTRY_CODE],n.[COUNTRY_CODE]) [COUNTRY_CODE],nullif(l.[POST_CODE],n.[POST_CODE]) [POST_CODE]
    from #tempUpdatedAddress l 
         left join UpdatedEntityStg n ON n.[ADDRESSID] = n.[ADDRESSID])
select [ADDRESSID],case when sum(case when [ADDRESS1] is null then 1 else 0 end)=0 
                          then max([ADDRESS1]) else null end [ADDRESS1],case when sum(case when [ADDRESS2] is null then 1 else 0 end)=0 
                          then max([ADDRESS2]) else null end [ADDRESS2],case when sum(case when [ADDRESS3] is null then 1 else 0 end)=0 
                          then max([ADDRESS3]) else null end [ADDRESS3],case when sum(case when [ADDRESS4] is null then 1 else 0 end)=0 
                          then max([ADDRESS4]) else null end [ADDRESS4],case when sum(case when [CITY] is null then 1 else 0 end)=0 
                          then max([CITY]) else null end [CITY],case when sum(case when [CLIENTID] is null then 1 else 0 end)=0 
                          then max([CLIENTID]) else null end [CLIENTID],case when sum(case when [COUNTRY_CODE] is null then 1 else 0 end)=0 
                          then max([COUNTRY_CODE]) else null end [COUNTRY_CODE],case when sum(case when [POST_CODE] is null then 1 else 0 end)=0 
                          then max([POST_CODE]) else null end [POST_CODE]
from nullif_cte nc
group by [ADDRESSID];
本文链接:https://www.f2er.com/2112.html

大家都在问