我有两个相似的表,一个是每月更新的实时表,另一个是相同的数据,但有一个snapshot
表,如下图所示。特别是,还有一个名为Live_History_Month
的附加列来确定数据输入的month_year。
我试图查看特定列的计数是否有任何变化,所以我可以进一步调查。 我创建了以下SQL代码
select codetoinvestigate
,Year_Month
,count(*)
from tbl1
where Live_History_Month = Year_Month
group by codetoinvestigate
,Year_Month
select codetoinvestigate
,Year_Month
,count(*)
from tbl2
group by codetoinvestigate
,Year_Month
现在如何链接这些对象,以便可以查看指定列的计数之间是否存在任何差异,从而可以做出需要调查的明智决定。
只需确认tbl1是快照表,tbl2是具有最新数据的表即可。
谢谢
答案 0 :(得分:1)
这将返回不同的计数和缺少的代码
with t1 as
(
select codetoinvestigate
,Year_Month
,count(*) as cnt
from tbl1
where Live_History_Month = Year_Month
group by codetoinvestigate
,Year_Month
),
t2 as
(
select codetoinvestigate
,Year_Month
,count(*) as cnt
from tbl2
group by codetoinvestigate
,Year_Month
)
select coalesce(t1.codetoinvestigate, t2.codetoinvestigate)
,coalesce(t1.Year_Month, t2.Year_Month)
,t1.cnt
,t2.cnt
,case when t1.codetoinvestigate is null
then 'missing code t1'
when t2.codetoinvestigate is null
then 'missing code t2'
when t1.cnt <> t2.cnt
then 'count different'
etc...
end
from t1 full join t2
on t1.codetoinvestigate = t2.codetoinvestigate
and t1.Year_Month = t2.Year_Month
and t1.cnt <> t2.cnt
要仅检查不同的计数,请切换到内部联接
答案 1 :(得分:0)
您可以使用UNION ALL
:
select t1.codetoinvestigate, t1.Year_Month, count(*) cnt, 'tbl1' as table_name
from tbl1 t1
where t1.Live_History_Month = Year_Month
group by t1.codetoinvestigate, t1.Year_Month
union all
select t2.codetoinvestigate, t2.Year_Month, count(*), 'tbl2'
from tbl2 t2
group by t2.codetoinvestigate, t2.Year_Month;
通过这种方式,您可以过滤出表名以获取差异。
答案 2 :(得分:0)
您可以尝试使用联接两个表
select A.codetoinvestigate,A.Year_Month, A.cnt1, B.cnt2 from
(
select codetoinvestigate
,Year_Month
,count(*) as cnt1
from tbl1
where Live_History_Month = Year_Month
group by codetoinvestigate
,Year_Month
) A inner join
(
select codetoinvestigate
,Year_Month
,count(*) cnt2
from tbl2
group by codetoinvestigate
,Year_Month
)B on A.codetoinvestigate=B.codetoinvestigate and A.Year_Month=B.Year_Month
答案 3 :(得分:0)
如果您只想查看更改,那为什么不做减号?
select codetoinvestigate
,Year_Month
,count(*)
from tbl1
where Live_History_Month = Year_Month
group by codetoinvestigate
,Year_Month
minus
select codetoinvestigate
,Year_Month
,count(*)
from tbl2
group by codetoinvestigate
,Year_Month
然后,您只获得发生更改的行
答案 4 :(得分:0)
在SQL Server 2012或更高版本上?试试:
select codetoinvestigate
,Year_Month
,count(*)
from tbl2
group by codetoinvestigate
,Year_Month
EXCEPT
select codetoinvestigate
,Year_Month
,count(*)
from tbl1
where Live_History_Month = Year_Month
group by codetoinvestigate
,Year_Month
这将返回在快照表(tbl1)中发现的与您当前最新数据(tbl2)不匹配的差异。