我在比较 2 个表时遇到了情况。一个是当前数据,另一个是以前数据的快照。比较的结果存储在#temp 表(已更改的行)中。之后,我将#temp 表与最后一个快照数据进行比较以跟踪更改的列。我需要为此我做了一个选择语句:
我正在考虑添加和 ROW_NUMber() 窗口函数,这可能会解决这个问题。 有什么建议吗?
如果我理解正确,您可以使用 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];