繁体   English   中英

比较两个表以查找丢失的记录

[英]Comparing two tables for missing records

如何比较两个表丢失记录和状态设置为Yes,如果存在于表-A 表-B的所有记录和NO当记录中的任何一个缺失? 举例来说,

表A

8000010001

8000011001

8000025001

8000025002


表B

8000010

8000010001

8000010002

8000011

8000011001

8000012

8000012001

8000023

8000023001

8000025

8000025001

8000025002

8000026

8000026001

8000026002


产量

8000010不

8000011是

8000012否

8000023不

8000025是

8000026没有


注意 -请检查表B ,您可以在记录之间找到父子关系。 例如8000010、8000010 001、8000010002。父记录(8000010、8000011、8000012 ...)未出现在表A中

尝试这个。

declare @tableA table(id varchar(10))
insert into @tableA values('800010001')
insert into @tableA values('8000011001')
insert into @tableA values('8000025001')
insert into @tableA values('8000025002')

declare @tableB table (id varchar(10))
insert into @tableB values('8000010')
insert into @tableB values('8000010001')
insert into @tableB values('8000010002')
insert into @tableB values('8000011')
insert into @tableB values('8000011001')
insert into @tableB values('8000012')
insert into @tableB values('8000012001')
insert into @tableB values('8000023')
insert into @tableB values('8000023001')
insert into @tableB values('8000025')
insert into @tableB values('8000025001')
insert into @tableB values('000025002')
insert into @tableB values('8000026')
insert into @tableB values('8000026001')
insert into @tableB values('8000026002')

使用左联接可以解决此问题。 但是最好的方法是通过唯一的ID映射两个表。

//比较tableA和tableB

select a.id, case when b.id IS null then 'No' else 'Yes' end as Status from @tableA a left join @tableB b on a.id = b.id

//将tableB与tableA比较

select b.id, case when a.id IS null then 'No' else 'Yes' end as Status from @tableB b left join @tableA a on a.id = b.id

我们需要首先拆分记录以使父子关系

第一个CTE拆分,最好将表更改为这种格式,而不是像现在这样的单个ID。

ID          parent
8000010     NULL
8000010001  8000010
8000010002  8000010

第二个CTE与TableA进行JOIN查找匹配记录最后,将实际的子计数与第二个CTE结果进行匹配,以将其标记为“否”或“是”

; WITH cte
as
(
SELECT ID, 
       case when Id/10000000 >0 
             then ID/1000
             else NULL
             end as parent
FROM TableB
)
, cte1
as
(
SELECT cte.parent, count(cte.id) as matchedChildrenCount
FROM cte
JOIN tableA A
ON cte.id = A.id

WHERE cte.parent is not null
GROUP BY parent 
)

SELECT T.parent, CASE WHEN cte1.parent is null or T.childrenCount <> cte1.matchedChildrenCount
                      THEN 'No' else 'Yes' 
                      END as value from 
(select parent, 
        COUNT(cte.id) as childrenCount   
 FROM cte 
 where cte.parent is not null
 group by parent 
 ) T
 left join cte1
 on cte1.parent = T.parent

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM